我刚刚开始使用async/await,并且对它如何与回调交互感到困惑.例如,
fooMethod(function() {
return Promise.resolve("foo");
});
Run Code Online (Sandbox Code Playgroud)
VS
fooMethod(async function() { //add async keyword
return "foo";
});
Run Code Online (Sandbox Code Playgroud)
必须以特定的方式编写fooMethod,以便它可以处理async
函数作为回调吗?
如果fooMethod
是公共图书馆,我怎么知道async
向该函数添加关键字是安全的?
跟进
Express路由器,
app.get('/foo', function (req, res) {
return res.send("foo");
});
app.get('/foo', async function (req, res) {
return res.send("foo");
});
Run Code Online (Sandbox Code Playgroud)
这两个功能都有效,虽然使用安全吗?
您的两个回调是等效的。Anasync function
只是function
返回 a 的正则表达式的语法糖Promise
。这意味着您可以async function
像常规函数一样调用。这里\xe2\x80\x99是一个演示:
const foo = async function (arg) {\r\n return arg * 2\r\n}\r\nconst bar = function (arg) {\r\n return Promise.resolve().then(() => {\r\n return arg * 2\r\n })\r\n}\r\n\r\nconst fooReturn = foo(2)\r\nconst barReturn = bar(2)\r\nconsole.log(\'foo(2) =>\', fooReturn.toString())\r\nconsole.log(\'bar(2) =>\', barReturn.toString())\r\n\r\nfooReturn.then(fooResult => console.log(\'await foo(2) =>\', fooResult))\r\nbarReturn.then(barResult => console.log(\'await bar(2) =>\', barResult))
Run Code Online (Sandbox Code Playgroud)\r\n但是,如果接受回调的代码想要获得响应,则\xe2\x80\x99将无法使用异步函数,除非代码专门设计用于检查回调函数的返回值及其await
是否\ xe2\x80\x99s 一个Promise
.