我正在尝试进行几个函数调用,这些函数将汇总信息,然后对该信息进行操作。有些调用会发出HTTP请求,这很慢。其他人则快得多。
我所有的函数调用都能正常工作并构建必要的数据,但是在继续前进之前,我需要等待HTTP请求。
我尝试了promises,async / await等。
const http = require('http');
async function operation() {
return new Promise(function(resolve, reject) {
const url = 'http://www.google.com';
http.get(url, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
resolve(resp.statusCode);
});
}).on("error", (err) => {
reject(err);
});
})
}
async function app() {
var a = await operation()
console.log('a: ', a) // this returns 200
}
function test() {
console.log('test: ','THIS SHOULD COME AFTER')
}
app()
test()
我需要test
函数的结果紧随app
之后。我看到200之前印有“此后应该出现”的字样
答案 0 :(得分:1)
正如我在评论中提到的,app
是一个异步函数,而测试是同步的。这意味着,如果您致电app(); test();
,test
将始终在app
解析之前完成。但是,请记住,Promises
最终将resolve
或reject
。
这意味着,要在异步之后调用同步函数,则需要在test
中调用app
,如下所示:
async function app() {
//add try-catch to handle rejection of promise
try {
var a = await operation()
console.log('a: ', a) // this returns 200
// now you can call test after app
test();
} catch (err) {
//handle error case to trigger rejection of promise
throw new Error(err)
}
}
或者记住Promises
是thenable
:
app()
.then(someReturnedValue => test())
.catch(err => /*handle errors*/)
您在注释中提到了几个类似app
的函数,这些函数将在test
之前聚合。您可以考虑使用Promise.all
,它接收Promises
的数组,并将返回与每个已解决的Promise对应的数据数组,或者在任何Promises拒绝时捕获错误。
Promise.all([app, app1, app2])
.then(arrayOfReturnedValues => test())
.catch(err => /*handle errors*/)