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

时间:2016-05-17 04:48:13

标签: node.js

我希望只在函数f1和f2完成后调用函数cb(注意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

1 个答案:

答案 0 :(得分:3)

var async = require('async');

console.log('before invocation');

async.parallel([
  function f1(cb) {
    console.log('f1 invoked');

    setTimeout(function () {
      console.log('f1 calling back');
      cb(null, 'one');
    }, 3000);
  },
  function f2(cb) {
    console.log('f2 invoked');

    setTimeout(function () {
      console.log('f2 calling back');
      cb(null, 'two');
    }, 1000);
  }
], function callback(err, results) {
  console.log('callback invoked');

  if (err) {
    console.log(err);
  } else {
    console.log('results: ', results);
  }
});

console.log('after invocation');

setTimeout(function () {
  console.log('2 seconds later...');
}, 2000);

输出:

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生成,它会自动为您执行错误处理和其他后台处理,类似于您的两个标志,但更有条理和更有效。