繁体   English   中英

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

[英]async parallel of API call with callback in node.js

我需要等待两个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(); 

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

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

使用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的结果将保存在results.functionA ,依此类推。

第一个参数为null(由于.bind),然后您传递所有其他所需的参数。 回调由函数之间的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); } }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/async/1.5.0/async.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM