获取回调以等待异步调用

问题描述 投票:0回答:1

我对所有这些东西都很陌生,有几个关于 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 行之后打印出变量填充。

此外,我不确定是否有可能,因为它在函数之外,但我很好奇是否也有可能让第 7 行在第 6 行之后打印出来。需要指出的是 updateTestVariable 函数没有被标记作为异步,那不是我想改变的东西,否则我怀疑我可以使用异步/等待?

如上所述,我不确定我对 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"

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

javascript node.js async-await callback
1个回答
0
投票

要让 5 在 4 之后出现,请考虑将

setTimeout()
包裹在
Promise
中。这允许回调正确地“等待”
setTimeout()
解决,然后调用 6。

对于最后一个 7,在

callback
中返回
updateTestVariable()
的调用结果,这样
updateTestVariable()
就会返回一个
Promise
,从而我们可以使用
.then()
仅在
updateTestVariable()
之后记录 7彻底解决

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));

© www.soinside.com 2019 - 2024. All rights reserved.