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