Нажатие на стену здесь, пытаясь заставить это работать - вывод console.log
должен быть 0, 1, 2, 3
. Он должен в основном цикл по массиву и вызов функции в последовательности неблокируемого способа (ожидание done()
, если он принят в):Петля через асинхронные обратные вызовы в неблокирующей последовательности
var array = [
function(done) {
setTimeout(function() {
console.log(0);
done();
}, 2000);
},
function(done) {
setTimeout(function() {
console.log(1);
done();
}, 200);
},
function() {
// This one is synchronous and doesn't need
// to use done()
console.log(2);
},
function(done) {
setTimeout(function() {
console.log(3);
done();
}, 70);
}
];
Я не возражаю, если решения используют генераторы, или посылы, или, возможно, что-то еще. Я думал, функция может быть обернуты что-то вдоль линий:
function fnWrapper(fn) {
return new Promise(function(resolve) {
if (fn.length >= 1) {
// If the done callback is passed in.
fn(resolve);
} else {
fn();
resolve();
}
});
}
array.reduce((promise, fn) => promise.then(fnWrapper(fn)), Promise.resolve());
http://codepen.io/ferahl/pen/wGoRZN?editors=0010
Но до сих пор мои попытки перебрать это с генератором или пообещать/уменьшить очень сломана. Есть идеи? Благодарю.
Update: PS Я не могу контролировать то, что асинхронный метод будет использоваться для вызова done()
в
Это прекрасное решение спасибо, проблема заключается в том, что эти функции написаны пользователями, и я не могу контролировать то, что асинхронный метод они используют –
ли метод асинхронного ожидается быть последовательным? Лучше всего выбрать метод и объяснить своим пользователям, какой метод асинхронного API ожидает. – SimpleJ
Да, возможно, вы правы, я дам ему подумать и принять, если я не могу придумать что-то. –