Nodejs - 异步/等待 - 没有等待的嵌套异步调用仍然阻塞?

时间:2021-04-22 21:41:51

标签: node.js async-await nested nonblocking

我希望 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); }
  1. mainCaller() 中的“await”是否正在等待所有异步调用,包括嵌套调用?
  2. 正确吗?
  3. 是否有更好的方法来实现嵌套异步调用以避免调用方的延迟?
  4. 我可以确认“saveData()”调用在我删除它时正在产生影响,并且我看到 mainCaller 在 datafx 返回后立即继续运行。

1 个答案:

答案 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 中描述的相同