node.js - async.parallel 不等待并行函数
问题描述
运行下面的代码我只是得到“未定义”。似乎 async.parallel 调用在 4 个并行函数完成之前执行了最终函数。
function classify(filename) {
var stack = [];
var functionOne = async function(callback){
//call to an API
res = await classifierOne(filename);
callback(null, res);
}
var functionTwo = async function(callback){
//call to an API
res = await classifierTwo(filename);
callback(null, res);
}
var functionThree = async function(callback){
//call to an API
res = await classifierThree(filename);
callback(null, res);
}
var functionFour = async function(callback){
//call to an API
res = await classifierFour(filename);
callback(null, res);
}
stack.push(functionOne);
stack.push(functionTwo);
stack.push(functionThree);
stack.push(functionFour);
async.parallel(stack, function(err, res){
console.log(res[0]);
})
}
解决方案
如果您使用async
with version 3.x
,我们有一个很大的变化 -支持 async/await,与 version 一起使用已包装到 Promise 的任务(当您使用 async/await 关键字时)然后callback
将被禁用,您需要返回任务中的值而不是调用callback(null, value)
。
这意味着,为了解决您的问题,代码将变为:
function classify(filename) {
var stack = [];
var functionOne = async function(){ // remove callback param
//call to an API
res = await classifierOne(filename);
return res; // return value
}
var functionTwo = async function(){
//call to an API
res = await classifierTwo(filename);
return res;
}
var functionThree = async function(){
//call to an API
res = await classifierThree(filename);
return res;
}
var functionFour = async function(){
//call to an API
res = await classifierFour(filename);
return res;
}
stack.push(functionOne);
stack.push(functionTwo);
stack.push(functionThree);
stack.push(functionFour);
async.parallel(stack, function(err, res){
console.log(res[0]);
})
}
P/s:我的建议是在这种情况下使用 Promise.all。说不callback
。
async function classify(filename) { // Make this function become a async function
var stack = [];
var functionOne = async function(){ // remove callback param
//call to an API
res = await classifierOne(filename);
return res; // return value
}
var functionTwo = async function(){
//call to an API
res = await classifierTwo(filename);
return res;
}
var functionThree = async function(){
//call to an API
res = await classifierThree(filename);
return res;
}
var functionFour = async function(){
//call to an API
res = await classifierFour(filename);
return res;
}
stack.push(functionOne);
stack.push(functionTwo);
stack.push(functionThree);
stack.push(functionFour);
const result = await Promise.all(stack); // Wait until all "task" finish
console.log(result);
return result; // Return the result of all tasks
}
// Call classify function inner a async function
const result = await classify('your_file_name'); // await keyword
console.log(result);
推荐阅读
- snakemake - snakemake中带有空格的文件
- excel - 评估单元格值是否是命名范围的一部分
- string - 如何将字符串转换为纯脚本中的字符列表?
- keras - 删除 Keras 中预训练的 VGG16 模型中的中间层
- python - 如何使用 PIL 裁剪多张图像?
- jsf - 如何通过 jee-7 中的 mdb-> websocket 更新数据表单元格?(db pk,clientId 映射)
- laravel - 带有 Synology NAS 的 Laravel 应用程序
- java - spring-data-couchbase - 带有 java.util.Date 方法参数的 N1QL 查询
- javascript - Node.js Express 如何在中间件之间传递数据?
- axapta - Axapta V4 批处理作业表权限问题