想要从异步调用中初始化一个值,然后继续使用该值,我不知道如何在节点将其他代码加载到这里之前等待。
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 --------------
答案 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
});