这是一些代码(这是一个过于简化的例子,我知道它是愚蠢的):
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function test() {
[1, 2, 3].map(() => {
console.log('test');
await sleep(1000);
});
}
test();
目标是:
test
然后等一秒test
然后等一秒test
然后等一秒但是运行此代码会导致失败:
await是一个保留字
我知道我可以通过使用for循环修复它:
async function test() {
for(let i = 0; i < 3; i++) {
console.log('test');
await sleep(1000);
}
}
但是有没有办法以更“功能”的方式做到这一点。我的意思是,我可以避免for
循环并在地图内等待吗?
答案 0 :(得分:4)
var result= await [1, 2, 3].reduce(function(prom,v){
return (async function(){
var result=await prom;
await sleep(1000);
result.push(v);
return result;
})();
},Promise.resolve([]));
http://jsbin.com/jocopixaro/edit?console
您可以减少创建承诺链。但是在你简单的情况下:
(a=b=>(b==2||(console.log("test"),setTimeout(a,1000,b+1))))(0);
答案 1 :(得分:1)
如果像bluebird这样的库是一个选项,那么你可以写:
'use strict'
const Promise = require('bluebird')
async function test() {
return Promise.mapSeries([1, 2, 3], async (idx) => {
console.log('test: ' + idx);
await Promise.delay(1000)
});
}
test();