Node.js 仅在执行其他异步函数后调用函数

Node.js 仅在执行其他异步函数后调用函数,node.js,Node.js,我希望函数cb只能在函数f1和f2完成后调用(请注意,f1和f2是异步的,它们可能在任何时候被无序调用) 我正在尝试实现类似的东西,但在node.js上实现它似乎不是最好的方法 var l1 = false; var l2 = false; // function to be called after f1 and f2 have ended function cb(err, res) { if (err) { console.log(err); } else { co

我希望函数cb只能在函数f1和f2完成后调用(请注意,f1和f2是异步的,它们可能在任何时候被无序调用)

我正在尝试实现类似的东西,但在node.js上实现它似乎不是最好的方法

var l1 = false;
var l2 = false;

// function to be called after f1 and f2 have ended
function cb(err, res) {
  if (err) {
    console.log(err);
  } else {
    console.log('result = ' + res);
  }
}

// f1 and f2 are practically identicals...
function f1(callback) {
  console.log('f1 called');
  l1 = true;
  if (l2) {
    console.log('f1 calling cb');
    callback(null, 'one');
  } else {
    console.log('f2 wasn\'t called yet');
  }
}

function f2(callback) {
  console.log('f2 called');
  l2 = true;
  if (l1) {
    console.log('f2 calling cb');
    callback(null, 'two');
  } else {
    console.log('f1 wasn\'t called yet');
  }
}

setTimeout(function() {
  f1(cb); // will call cb
}, 3000);
setTimeout(function() {
  f2(cb); // won't call cb
}, 1000);

// It will print:
// f2 called
// f1 wasn't called yet
// f1 called
// f1 calling cb
// result = one
输出:

before invocation
f1 invoked
f2 invoked
after invocation
f2 calling back
2 seconds later...
f1 calling back
callback invoked
results:  [ 'one', 'two' ]
请原谅我没有完美地复制您的场景,但我承认您所拥有的只是一个模型

唯一的区别是,最终回调包含来自并行执行的每个函数的结果数组,并且在每个函数内部调用
setTimeout()


请注意,返回的数组是
['one','two']
,因为这是传递给
async.parallel()
的函数的顺序。提供给每个函数的
cb
参数是由async生成的,它会自动为您进行错误处理和其他后台处理,类似于您使用两个标志的方式,但更具组织性和效率。

使用承诺来实现这一点。您愿意使用外部库吗?对于像这样的场景和许多其他场景,有一种流行的称为。如果你说你愿意,我会写一个答案,解释如何将它应用到这个特定的场景中。是的,我确实在寻找一个使用外部库的解决方案。我查看了async模块,但找不到任何有用的东西。相关:但通常这些天我建议使用async.js。我发现这个解决方案的问题是,调用async.parallel()时,会同时调用f1和f2函数。我实际上没有关于何时调用f1或f2的信息(它们是独立的)。例如,现在可以调用f1,2分钟后可以调用f2。setTimeout只是一个例子,我应该有如下内容:handler.on('some_event',f1);handler.on('other_event',f2);谢谢你的帮助@orangesky如果你能详细说明调用
f1
f2
的函数,以及这两个函数应该做什么(除了处理最终回调的标志),我可以给你一个更好的答案。但是如果没有这些信息,我很难确切地说出我在处理什么。
before invocation
f1 invoked
f2 invoked
after invocation
f2 calling back
2 seconds later...
f1 calling back
callback invoked
results:  [ 'one', 'two' ]