我希望 datafx 中的 saveData() 调用不会阻塞任何东西,因为没有“等待”但是当我检查日志和时间戳时,我注意到“主要完成”日志被延迟,即使“检索数据”不是.
async function mainCaller(){
// do something and then trigger call to get data
let id = 13;
let data = await datafx( id ); <-- this gets blocked for saveData() - why?
LOG( `main done` );
}
async function datafx( id ){
// get data
let data = await getData( id );
// cleanup data
// save data but don't wait for it
// datafx does not wait for it as expected
// however, mainCaller() is somehow "delayed" by it based on log timestamps
saveData(id, data );
LOG( `retrieved data` );
return data;
}
async function getData(id){ return await dbRead(id); }
async function saveData(id, data){ return await dbSave(id, data); }
答案 0 :(得分:0)
考虑以下代码 -
function timeoutPromise(interval) {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve("done");
}, interval);
});
};
async function timeTest1() {
await timeoutPromise(3000);
await timeoutPromise(3000);
}
async function timeTest3() {
await timeoutPromise(3000);
}
async function timeTest2() {
await timeoutPromise(3000);
timeTest3();
}
async function test1() {
let startTime = Date.now();
await timeTest1();
let finishTime = Date.now();
let timeTaken = finishTime - startTime;
console.log("Time taken for test1 in milliseconds: " + timeTaken);
}
async function test2() {
let startTime = Date.now();
await timeTest2();
let finishTime = Date.now();
let timeTaken = finishTime - startTime;
console.log("Time taken for test2 in milliseconds: " + timeTaken);
}
async function test3() {
let startTime = Date.now();
timeTest1();
let finishTime = Date.now();
let timeTaken = finishTime - startTime;
console.log("Time taken for test3 in milliseconds: " + timeTaken);
}
test1();
test2();
test3();
这个程序的输出如下-
Time taken for test3 in milliseconds: 0
Time taken for test2 in milliseconds: 3004
Time taken for test1 in milliseconds: 6008
对您的问题回答如下-
<块引用>mainCaller()
中的“await”是否正在等待所有异步调用,包括嵌套调用?
考虑上面提到的示例代码中的函数test2
,答案是否。
有没有更好的方法来实现嵌套的异步调用来避免 延迟来电?
是的,您需要在调用 await
函数时从 mainCaller
中删除 datafx
,与函数 test3
中描述的相同