Предположим, у нас есть несколько одновременных задач, каждая из которых выполняет хотя бы один веб-запрос в тот или иной момент, и для их выполнения требуется некоторое время. Предположим, что они также могут или не могут в какой-то произвольный момент выполнения запускать функцию, которая возвращает обещание. Предположим, также необходимо убедиться, что некоторые из этих промисов никогда не выполняются одновременно.
Я мог бы создать единую точку встречи, где встретились бы все эти параллельные задачи, создать цепочку промисов из тех функций, которые возвращают промисы, которые не должны выполняться одновременно, и продолжить после того, как все это будет сделано. У этого есть обратная сторона потенциального бесполезного ожидания, если некоторые из этих задач достигают точки встречи значительно раньше, чем другие, но все еще имеют много работы после точки встречи.
Кроме того, я попытался реализовать простую очередь обещаний, например:
function PromiseQueue() {
var promise = Promise.resolve();
return {
push: function(fn) {
promise = promise.then(fn, fn);
return this;
}
}
}
Эта очередь работает, но есть проблема, заключающаяся в том, что я не вижу способа отправить функцию в очередь из одной из параллельных задач, а также дождаться результатов, которые будут доступны только после того, как очередь решит обработать отправленный элемент, а не упомяните, что обещание еще не создано в момент отправки функции в очередь, поэтому нечего ждать в момент отправки функции создания обещания в очередь.
Я хотел бы достичь вышеупомянутого, придерживаясь формата async/await ECMAScript 2017 и обещаний ES6, насколько это возможно.
Ниже приведен пример описанной проблемы с двумя одновременными задачами, где subPromise1 и subPromise2 не должны выполняться одновременно, но, как написано в настоящее время, могут, но я хотел бы общее решение для произвольного количества одновременных задач.
async function async1() {
//do some long running work
const sPResult = await subPromise1;
//do some more long running work depending on sPResult
}
async function async2() {
//do some different long running work
const sPResult = await subPromise2;
//do some more different long running work depending on sPResult
}
async function mainFunction() {
//something
const totalResult = await Promise.all([async1,async2]);
//something else
}
EDIT: Вот работающая скрипта, в которой можно увидеть проблему, описанную изначально: https://jsfiddle.net/40gchrw6/
EDIT: Вот рабочее решение: https://jsfiddle.net/f2ewsugm/ 1/а>