以非阻塞顺序循环异步回调
Loop through async callbacks in non-blocking sequence
试图让它工作时遇到了困难 - 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);
}
];
我不介意解决方案是使用生成器、Promises 还是其他东西。我在想这个函数可以按照以下方式包装:
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
但到目前为止,我尝试使用生成器或 promise/reduce 循环遍历它的尝试非常失败。有任何想法吗?谢谢。
更新:PS我无法控制在
中使用什么异步方法调用done()
这是一个使用 promises 的解决方案(以及 Array.prototype.reduce
到 运行 系列函数):
// promise version of setTimeout
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
var array = [
function() {
return delay(2000)
.then(() => console.log(0));
},
function() {
return delay(200)
.then(() => console.log(1));
},
function() {
console.log(2);
},
function() {
return delay(70)
.then(() => console.log(3));
}
];
array.reduce((promise, fn) => promise.then(fn), Promise.resolve());
我意识到,为了让我的承诺按顺序执行,我需要 return 一个函数,该函数 return 在 then
中编辑承诺(而不是传递承诺自己进入其中):
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());
试图让它工作时遇到了困难 - 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);
}
];
我不介意解决方案是使用生成器、Promises 还是其他东西。我在想这个函数可以按照以下方式包装:
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
但到目前为止,我尝试使用生成器或 promise/reduce 循环遍历它的尝试非常失败。有任何想法吗?谢谢。
更新:PS我无法控制在
中使用什么异步方法调用done()
这是一个使用 promises 的解决方案(以及 Array.prototype.reduce
到 运行 系列函数):
// promise version of setTimeout
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
var array = [
function() {
return delay(2000)
.then(() => console.log(0));
},
function() {
return delay(200)
.then(() => console.log(1));
},
function() {
console.log(2);
},
function() {
return delay(70)
.then(() => console.log(3));
}
];
array.reduce((promise, fn) => promise.then(fn), Promise.resolve());
我意识到,为了让我的承诺按顺序执行,我需要 return 一个函数,该函数 return 在 then
中编辑承诺(而不是传递承诺自己进入其中):
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());