节点启动期间如何在主等待?

时间:2019-06-29 18:37:07

标签: node.js

想要从异步调用中初始化一个值,然后继续使用该值,我不知道如何在节点将其他代码加载到这里之前等待。

console.log('---- initialize the value during startup ----');
const p1 = (async () => {
    const res = await requestAsync.get('https://nodejs.org/dist/latest-v8.x/docs/api/util.html');
    return res.headers;
})();
const v2 = p1.then(v => (v));

console.log(v2);
console.log('---------- more work after v2 is resolved --------------');

我得到

---- initialize the value during startup ----
Promise { <pending> }
---------- more work after v2 is resolved --------------

2 个答案:

答案 0 :(得分:1)

我不确定我理解你的意思,但是也许这就是你想要的?

async function main() {
  const response = await requestAsync.get('https://n...');
  const headers = response.headers;

  console.log('some other stuff here');
}

main();

将所有内容都放入“主要”功能中,可以让您在执行其他任何操作之前等待初始请求。

但是请小心:这会阻塞,因此,如果请求需要一段时间,则直到完成后,您的代码中都不会发生任何事情。

答案 1 :(得分:1)

直到node.js具有最高级别await(目前尚无),然后通常的处理方式是仅使用.then()并放置所有与异步结果有关的内容在.then()处理程序中:

requestAsync.get('https://nodejs.org/dist/latest-v8.x/docs/api/util.html').then(result => {
    // put all the rest of your initialization code that 
    // needs this async result here
}).catch(err => {
    // handle errors here
});

如果您愿意(仅出于代码结构的原因),可以将所有内容移至一个函数中:

requestAsync.get('https://nodejs.org/dist/latest-v8.x/docs/api/util.html')
  .then(startup)
  .catch(handleErr);

function startup(result) {
   // put your startup code here that needs result
}

function handleErr(err) {
   // handle error here
}

请记住,其他任何启动代码都将继续,因为模块加载不会阻止等待此异步结果。


如果您要连续执行多个异步操作,则可以将它们链接起来:

 requestAsync.get().then(f1).then(f2).catch(err => {....});

或者,您可以将代码包装在顶级函数中,以便可以使用await:

 async function startup() {
      let result1 = await f1(...);
      let result2 = await f2(...);
      let result3 = await f3(...);
 }

 startup().then(finalResult => {
    // all async operation done here with finalResult
 }).catch(err => {
    // error starting up
 });