等待两个异步功能完成,然后在Node.js中继续

时间:2018-09-10 13:51:37

标签: javascript node.js

我正在开发Node.js中的应用程序,在该应用程序中我两次调用了异步函数,并将该值分配给全局变量。

问题是我想使用这两次调用的结果来做其他事情,但这并不是等待分配结果。

这是我的代码:

var a;
var b;

let x = 'abcd';
foo(x).then(data=>{
    a = data;
});

x = 'efgh';
foo(x).then(data=>{
    b = data;
});

console.log(a + b); // for example

在执行a + b之前如何等待两个函数完成?

4 个答案:

答案 0 :(得分:4)

foo返回一个Promise时,应使用async关键字将函数标记为asyncronus,并使用foo关键字等待await函数响应。即:

 async function someFunction(){   
  let x = 'abcd';
  let a = await  foo(x);

  x = 'efgh';
  let b = await foo(x);
  console.log(a + b)
}

答案 1 :(得分:2)

您可以在此处使用Promise.all,等待两个诺言,然后使用它们的数据:

let promises = [];
let x = 'abcd';
promises.push(foo(x))

x = 'efgh';
promises.push(foo(x))

Promise.all(promises).then(([a, b]) => {
  console.log(a, b); // for example
});


function foo(d) {
  return Promise.resolve({somePaddingData:"", d});
}

答案 2 :(得分:0)

可以使用.then()来代替await。 所以这个:

foo(x).then(data=>{
    a = data;
});

会是这样的:

a = await foo(x);

其他功能相同。这将导致您的执行要等到函数返回。 但是请注意,要使用await,您必须将使用它的语句,甚至更好的是将整个块包装在声明为aync的函数中。使用async here

答案 3 :(得分:0)

尝试一下:

//using setInterval to wait for completion

//a function which returns a callback
function foo(x,callback){
  //do some computaion on x
  callback(x);
};

//to store the response
let result = [];

//calling foo method twice parallely
foo("123",(data)=>{
  result.push(data);
});

foo("456",(data)=>{
  result.push(data);
});

//waiting till the above functions are done with the execution
//setInterval function will check every 100 ms(can be any value) if the length of the result array is 2
let timer = setInterval(() => {
  if (result.length == 2) {
    clearInterval(timer);
    //prints the two value
    console.log(result.join(""))
  }
}, 100);