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)

nginx如何一个域名多个端口?

node源码详解

server.listen(port, '127.0.0.1') 无法访问容器化节点服务器