server.listen() 的异步而不是 then()
Posted
技术标签:
【中文标题】server.listen() 的异步而不是 then()【英文标题】:Async instead of then() for server.listen() 【发布时间】:2019-04-17 01:23:36 【问题描述】:这是启动 apollo 服务器的方式:
server.listen(port).then(( url ) =>
console.log(`Server ready at $url`)
)
我想使用 async/await 合成器。所以我试着做 - 这是错误的:
server.listen(port, async ( url ) =>
await anyFunction()
console.log(`Server ready at $url`)
)
【问题讨论】:
【参考方案1】:async-await
的行为与.then()
链类似,await
等待承诺得到解决或拒绝,然后继续处理,就像.then()
继续承诺解决和.catch()
承诺拒绝。
await
返回的结果与.then()
获得承诺解决的结果相同,即:
foo().then( function(result)); // got result here
result = await foo(); // will get same result here too as in above function.
同样,try-catch
中的 catch(err)
与 .then()-.catch()
中的 .catch( function(err) )
得到相同的错误。
详细了解async-await here 和here。
要将您的 .then() 转换为 async-await,只需执行以下操作:
(async function ()
try
const url = await server.listen(port);
console.log(`Server ready at $url`);
catch(e)
// handle errors
)(); // This is [IIFE][3]. In this case it's better to have IIFE then regular function, as functions needed to be called.
async-await 作为一个函数:
async function startServer()
try
const url = await server.listen(port);
console.log(`Server ready at $url`);
catch(e)
// handle errors
startServer(); // Not an IIFE
【讨论】:
不知道 IIFE。 一个 IIFE(立即调用函数表达式)是一个 javascript 函数,一旦定义就会运行。 developer.mozilla.org/en-US/docs/Glossary/IIFE【参考方案2】:你必须await
承诺返回,不要退回到回调风格:
(async function ()
const url = await server.listen(port);
console.log(`Server listening at "$url"`);
)();
【讨论】:
【参考方案3】:您必须将函数作为整个代码块包含在 async
。然后,就像在server.listen
上调用.then
一样,您可以改为await server.listen(...
:
async function foo()
// ...
const url = await server.listen(port);
console.log(`Server ready at $url`);
确保也捕获错误 - 无论是在 foo
的使用者中:
foo()
.catch((err) =>
// handle errors
);
或者在foo
内的catch
块中:
async function foo()
try
const url = await server.listen(port);
console.log(`Server ready at $url`);
catch(e)
// handle errors
【讨论】:
以上是关于server.listen() 的异步而不是 then()的主要内容,如果未能解决你的问题,请参考以下文章
Angular-Gantt - 可以将日期的标题更改为“M,T,W,Th ...”而不是日期?
Flutter:移动到上一个屏幕(2nd)并仅删除上一个屏幕(2nd 3rd 4th),而不是所有屏幕(1st 2nd 3rd 4th)