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

时间:2017-06-15 13:17:24

标签: javascript node.js asynchronous functional-programming 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();

目标是:

  1. 显示test然后等一秒
  2. 然后显示test然后等一秒
  3. 然后显示test然后等一秒
  4. 但是运行此代码会导致失败:

      

    await是一个保留字

    我知道我可以通过使用for循环修复它:

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

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

2 个答案:

答案 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();