[英]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.