21

当使用简单的回调如在下面的例子:如何“等待”回调返回?

test() { 
    api.on('someEvent', function(response) { 
    return response; 
    }); 
} 

如何函数更改为使用异步/ AWAIT?具体地,假设“someEvent”被保证被调用一次且仅一次,我想的功能测试是一个异步函数,直到执行回调没有返回如:

async test() { 
    return await api.on('someEvent'); 
} 
+0

仅供参考,ES7/ES2016 specificati on已经完成,并且不包括async/await。目前它只是一个[第3阶段提案](https://github.com/tc39/ecma262#current-proposals)。 –

+0

那真是令人惊讶 - 非常希望它包括在内!感谢信息@DanPrince – sean2078

+1

ES2015和ES6是同一件事情可能会造成混淆,但应该注意的是ES7不能与ES2016互换。 ES2016是一个成就的事实。 ES7是WIP。 – estus

回答

37

async/await是不魔法。异步函数是一个函数,可以为您展开Promise,因此您需要api.on()才能返回Promise以使其工作。事情是这样的:

function apiOn(event) { 
    return new Promise(resolve => { 
    api.on(event, response => resolve(response)); 
    }); 
} 

然后

async function test() { 
    return await apiOn('someEvent'); // await is actually optional here 
             // you'd return a Promise either way. 
} 

但是,这也是一个谎言,因为异步函数也返回承诺自己,所以你不会真正得到的值超出test() ,而是一个价值的承诺,您可以这样使用:

async function whatever() { 
    // snip 
    const response = await test(); 
    // use response here 
    // snip 
} 
+1

我没有太多尝试编辑的机会,但'test()'函数有错误。它应该返回'await apiOn('someEvent')'而不是'await api.on('someEvent')'。 'test()'函数旨在调用新创建的'api.on'的promise包装器,而不是直接调用它。 – kylethebaker

+0

这个答案拯救了我的一天! – karthikeayan