async.parallel 不等待并行函数
async.parallel doesn't wait for the parallel functions
运行 下面的代码我刚得到 "undefined"。似乎 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
npm 库,但最重要的是,当你有 async
的回调函数时它似乎不起作用。如果您尝试使用本机承诺,它将起作用。像
function classify(filename) {
var stack = [];
var functionOne = function(callback) {
//call to an API
classifierOne(filename).then(res => callback(null, res));
};
var functionTwo = function(callback) {
classifierTwo(filename).then(res => callback(null, res));
};
var functionThree = function(callback) {
classifierThree(filename).then(res => callback(null, res));
};
var functionFour = function(callback) {
classifierFour(filename).then(res => callback(null, res));
};
stack.push(functionOne);
stack.push(functionTwo);
stack.push(functionThree);
stack.push(functionFour);
async.parallel(stack, function(err, res) {
console.log(res);
});
}
您的方法,例如 functionOne
错过了 return 并且没有回调。下面returns ["1","2","3","4"]
.
const async = require('async');
const classifierOne = async ()=> "1"
const classifierTwo = async ()=> "2"
const classifierThree = async ()=> "3"
const classifierFour = async ()=> "4"
const classify = filename => {
var stack = [];
var functionOne = async ()=> classifierOne(filename);
var functionTwo = async ()=> classifierTwo(filename);
var functionThree = async ()=> classifierThree(filename);
var functionFour = async ()=> classifierFour(filename);
stack.push(functionOne);
stack.push(functionTwo);
stack.push(functionThree);
stack.push(functionFour);
async.parallel(stack, (err, res)=>{
console.log(res);
})
}
classify("x");
如果您使用 async
版本 3.x
,我们有一个很大的变化 - Support async/await ,版本,任务已经包装到 Promise(当您使用 async/await 关键字)然后 callback
将被禁用,您需要在任务中 return 值而不是调用 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);
运行 下面的代码我刚得到 "undefined"。似乎 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
npm 库,但最重要的是,当你有 async
的回调函数时它似乎不起作用。如果您尝试使用本机承诺,它将起作用。像
function classify(filename) {
var stack = [];
var functionOne = function(callback) {
//call to an API
classifierOne(filename).then(res => callback(null, res));
};
var functionTwo = function(callback) {
classifierTwo(filename).then(res => callback(null, res));
};
var functionThree = function(callback) {
classifierThree(filename).then(res => callback(null, res));
};
var functionFour = function(callback) {
classifierFour(filename).then(res => callback(null, res));
};
stack.push(functionOne);
stack.push(functionTwo);
stack.push(functionThree);
stack.push(functionFour);
async.parallel(stack, function(err, res) {
console.log(res);
});
}
您的方法,例如 functionOne
错过了 return 并且没有回调。下面returns ["1","2","3","4"]
.
const async = require('async');
const classifierOne = async ()=> "1"
const classifierTwo = async ()=> "2"
const classifierThree = async ()=> "3"
const classifierFour = async ()=> "4"
const classify = filename => {
var stack = [];
var functionOne = async ()=> classifierOne(filename);
var functionTwo = async ()=> classifierTwo(filename);
var functionThree = async ()=> classifierThree(filename);
var functionFour = async ()=> classifierFour(filename);
stack.push(functionOne);
stack.push(functionTwo);
stack.push(functionThree);
stack.push(functionFour);
async.parallel(stack, (err, res)=>{
console.log(res);
})
}
classify("x");
如果您使用 async
版本 3.x
,我们有一个很大的变化 - Support async/await ,版本,任务已经包装到 Promise(当您使用 async/await 关键字)然后 callback
将被禁用,您需要在任务中 return 值而不是调用 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);