在异步函数内的回调中调用await

rap*_*2-h 7 javascript asynchronous functional-programming node.js async-await

这是一些代码(这是一个过于简化的示例,我知道这很愚蠢):

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function test() {
    [1, 2, 3].map(() => {
        console.log('test');
        await sleep(1000);
    });
}
test();
Run Code Online (Sandbox Code Playgroud)

目的是:

  1. 显示test然后等待一秒钟
  2. 然后显示test然后等待一秒钟
  3. 然后显示test然后等待一秒钟

但是运行此代码会导致失败:

等待是保留字

我知道我可以通过使用for循环来解决它:

async function test() {
    for(let i = 0; i < 3; i++) {
        console.log('test');
        await sleep(1000);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是有没有办法以一种更加“实用”的方式来做到这一点。我的意思是,我可以避免for循环并在地图内等待吗?

Jon*_*lms 6

const result = await [1, 2, 3].reduce(async function(prom, v){   
    const result= await prom;
    await sleep(1000);
    result.push(v);
    return result;
 }, Promise.resolve([]));
Run Code Online (Sandbox Code Playgroud)

您可以减少以创建承诺链。但是,在您的简单情况下:

(a=b=>(b==2||(console.log("test"),setTimeout(a,1000,b+1))))(0);
Run Code Online (Sandbox Code Playgroud)