API调用的异步并行与node.js中的回调

时间:2015-12-24 00:44:54

标签: javascript node.js asynchronous callback parallel-processing

我需要等待两个API回调函数的任务,当任务完成时,我希望收到一个回调,这样我就可以使用这两个函数的数据了。

我希望这个函数能够并行执行...我读了很多关于async.parallel的问题,但我找不到一种方法来使用async这些函数。

当然,异步只是一个例子,如果有效,任何其他方式都可以。

对不起我的英语不好,我希望代码更容易理解。

谢谢



var dataFunctionA = "";
var dataFunctionB = "";

var callbackFunctionA = function(err, response, data) {
  // do some work with data
  dataFunctionA = "Hello";
}

var callbackFunctionB = function(err, response, data) {
  // do some work with data
  dataFunctionB = " World!";
}

function printHelloWorld(){
   console.write(dataFunctionA + dataFunctionB);
}


APIClient.functionA(paramA, callbackFunctionA);

APIClient.functionB(paramB, callbackFunctionB);

// need to wait for the two callbacks
printHelloWorld();




2 个答案:

答案 0 :(得分:1)

如果您不想使用承诺,可以执行以下操作:



var dataFunctionA = "";
var dataFunctionB = "";
var dataFunctionCount = 2;

function checkDone() {
  dataFunctionCount--;
  if(dataFunctionCount === 0) {
// need to wait for the two callbacks
printHelloWorld();  
  }
}

var callbackFunctionA = function(err, response, data) {
  // do some work with data
  dataFunctionA = "Hello";
  checkDone();
}

var callbackFunctionB = function(err, response, data) {
  // do some work with data
  dataFunctionB = " World!";
  checkDone();
}

function printHelloWorld(){
   console.write(dataFunctionA + dataFunctionB);
}

APIClient.functionA(paramA, callbackFunctionA);

APIClient.functionB(paramB, callbackFunctionB);




答案 1 :(得分:0)

使用function draw(){ clear(); //draw characters drawCharacter(window.character[0]['imageObject'],window.character[0]['imageObject']['x'],window.character[0]['imageObject']['y'],window.character[0]['imageObject']['w'],window.character[0]['imageObject']['h']); window.character[0]['imageObject']['x'] += 10; console.log(window.character[0]['imageObject']['x']); //returning 0 every time, not incrementing the way I expected it to. } ,您可以通过以下方式实现:

async.parallel

在你的函数中,在完成数据处理之后你应该调用传递的隐式并行回调。

async.parallel({
    functionA: APIClient.functionA.bind(null, paramA),
    functionB: APIClient.functionB.bind(null, paramB)

}, function(error, results) {
    processCallbacks(error, results);
});

你在这里做的是将函数对象传递给并行函数。此处使用对象的键,以便您可以访问结果数组。对于上面的示例,functionA(paramA, callback) { // data processing callback(null, resultFromProcessingParamA); } 的结果将保存在functionA中,依此类推。

第一个参数为null(由于.bind),然后传递所有其他所需的参数。回调由函数之间的results.functionA自动传递,最后一个回调仅在所有函数完成时调用。

请运行以下代码段以便更好地理解。



parallel

function functionA (paramA, callback) {
  $('body').append('<p> Parallel execution of function A and waiting for 5 seconds, parameter passed: ' + paramA + '</p>');
  setTimeout(function(){
        $('body').append('<p>processed functionA</p>');
    callback(null, ++paramA);
  }, 5000);
}

function functionB (paramB, callback) {
  $('body').append('<p> Parallel execution of function B and waiting for 1 second, parameter passed: ' + paramB + '</p>');
  setTimeout(function(){
    $('body').append('<p>processed functionB</p>');
    callback(null, ++paramB);
  }, 1000);
}

function processCallbacks (results) {
  $('body').append('<p> Processing results from two functions. ParamA now is:' + results.functionA + ' and paramB now is:' + results.functionB + '</p>');
}


async.parallel({
  
    functionA: functionA.bind(null, 10),
    functionB: functionB.bind(null, 2)

}, function(error, results) {
  console.log(results);
    if (!error) {
      processCallbacks(results);
    }
  
});
&#13;
&#13;
&#13;