NodeJS 获取回调以等待异步调用

hyrbngr7  于 2023-04-29  发布在  Node.js
关注(0)|答案(1)|浏览(164)

我对所有这些东西都很陌生,并且有一些关于Nodejs/js中的异步和回调的问题。
我有下面的小提琴设置:https://jsfiddle.net/JimmyJoe12378/38nkcuhL/17/

function updateTestVariable(key, callback) {
  console.log("2 ENTERupdateTestVariable key is: " + key);
  callback(key)
}

var testVariable = ""

console.log("1 BEFORE updateTestVariable is called testVariable is " + testVariable)

updateTestVariable("VARIABLE HAS UPDATED", async function(firstParam) {
  console.log("3 ENTER updateTestVariable firstParam is: " + firstParam);
  console.log("4 text before timeout starts testVariable is: " + testVariable)

  var mockingAsyncServiceCall = await setTimeout(() => {
    testVariable = firstParam
    console.log("5 AFTER TIMEOUT COMPLETE  testVariable is " + testVariable)
  }, 4000);

  console.log("6 line after timeout, testVariable is " + testVariable)
})

console.log("7 AFTER updateTestVariable is called testVariable is " + testVariable)

本质上,我想做的是调用一个函数,在本例中称为“updateTestVariable”,它接受一个键和一个回调函数。
在调用updateTestVariable函数之前,我声明了一个变量(称为testVariable)。在传递给updateTestVariable的回调函数中,我试图模拟一个异步服务调用,该调用将更新变量。我使用setTimeout()函数来处理这个问题(我不确定这是否是这个的正确表示)。为了便于参考,我已经在小提琴中对日志语句进行了编号。
无论如何,下面你可以看到我的日志打印出来的顺序。
所需的输出将是第6行等待直到mockAsyncServiceCall完成,并在第5行之后打印出填充变量。
另外,我不确定是否可能,因为它在函数之外,但我只是好奇是否也可以在第6行之后打印出第7行。需要指出的是updateTestVariable函数没有标记为async,这不是我想改变的,否则我怀疑我可以使用async/await?
如上所述,我不确定我对setTimeout函数的使用是否实际上是对异步服务调用的正确模仿,但我只是在尝试。

"1 BEFORE updateTestVariable is called testVariable is "
"2 ENTERupdateTestVariable key is: VARIABLE HAS UPDATED"
"3 ENTER updateTestVariable firstParam is: VARIABLE HAS UPDATED"
"4 text before timeout starts testVariable is: "
"7 AFTER updateTestVariable is called testVariable is "
"6 line after timeout, testVariable is "
"5 AFTER TIMEOUT COMPLETE  testVariable is VARIABLE HAS UPDATED"

任何帮助都非常感谢,谢谢。

xxe27gdn

xxe27gdn1#

要使5在4之后出现,请考虑将setTimeout() Package 在Promise中。这允许回调在调用6之前正确地“等待”setTimeout()解析。
对于最后的7,返回callback的调用结果为updateTestVariable(),这样updateTestVariable()就返回一个Promise,因此我们可以使用.then()来记录7,只有在updateTestVariable()完全解析之后。

function updateTestVariable(key, callback) {
  console.log("2 ENTERupdateTestVariable key is: " + key);
  return callback(key)
}

var testVariable = ""

console.log("1 BEFORE updateTestVariable is called testVariable is " + testVariable)

updateTestVariable("VARIABLE HAS UPDATED", async function(firstParam) {
  console.log("3 ENTER updateTestVariable firstParam is: " + firstParam);
  console.log("4 text before timeout starts testVariable is: " + testVariable)

  var mockingAsyncServiceCall = await new Promise((resolve) => {
    setTimeout(() => {
      testVariable = firstParam
      console.log("5 AFTER TIMEOUT COMPLETE  testVariable is " + testVariable);
      resolve();
    }, 4000);
  });

  console.log("6 line after timeout, testVariable is " + testVariable);
}).then(() => console.log("7 AFTER updateTestVariable is called testVariable is " + testVariable));

相关问题