异步函数作为回调函数

Zan*_*nko 6 javascript

我刚刚开始使用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)

这两个功能都有效,虽然使用安全吗?

Jed*_*Fox 3

您的两个回调是等效的。Anasync function只是function返回 a 的正则表达式的语法糖Promise。这意味着您可以async function像常规函数一样调用。这里\xe2\x80\x99是一个演示:

\n\n

\r\n
\r\n
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
\r\n
\r\n

\n\n

但是,如果接受回调的代码想要获得响应,则\xe2\x80\x99将无法使用异步函数,除非代码专门设计用于检查回调函数的返回值及其await是否\ xe2\x80\x99s 一个Promise.

\n