首页 > 解决方案 > 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]);
    })
}

标签: node.jsasync.js

解决方案


如果您使用asyncwith 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);

推荐阅读