繁体   English   中英

异步函数作为回调

[英]Async function as callback

我刚刚开始使用async / await,并且对如何与回调交互感到困惑。 例如,

fooMethod(function() {
    return Promise.resolve("foo");
});

fooMethod(async function() { //add async keyword
    return "foo";
});

是否必须以特定的方式编写fooMethod,以便它可以将async函数作为回调处理?

如果fooMethod是一个公共库,我怎么知道向该函数添加async关键字是安全的?

跟进

快速路由器,

app.get('/foo', function (req, res) {
  return res.send("foo");
});



app.get('/foo', async function (req, res) {
  return res.send("foo");
});

这两个功能都可以使用,但是使用起来安全吗?

您的两个回调是等效的。 async function仅仅是返回Promise的常规function语法糖。 这意味着您可以像调用常规函数一样调用async function函数。 这是一个演示:

 const foo = async function (arg) { return arg * 2 } const bar = function (arg) { return Promise.resolve().then(() => { return arg * 2 }) } const fooReturn = foo(2) const barReturn = bar(2) console.log('foo(2) =>', fooReturn.toString()) console.log('bar(2) =>', barReturn.toString()) fooReturn.then(fooResult => console.log('await foo(2) =>', fooResult)) barReturn.then(barResult => console.log('await bar(2) =>', barResult)) 

但是,如果接受回调的代码想要获得响应,则除非该代码专门用于检查回调函数的返回值并await它是否为Promise否则您将无法使用异步函数。

您的两个函数是等效的,但是下面演示了如何在async function使用await每次使函数执行延迟一个额外的滴答声:

 function syncTest() { console.log('sync completed') return Promise.resolve('foo') } async function asyncTest() { console.log('async completed') return 'foo' } async function awaitTest() { console.log('await started') await void 0 console.log('await awaited') await void 0 console.log('await completed') return 'foo' } console.log('start') syncTest().then(value => console.log(`sync resolved: ${value}`)) asyncTest().then(value => console.log(`async resolved: ${value}`)) awaitTest().then(value => console.log(`await resolved: ${value}`)) Promise.resolve() .then(() => console.log('tick 2 completed')) .then(() => console.log('tick 3 completed')) .then(() => console.log('tick 4 completed')) console.log('tick 1 completed') 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM