For 循环迭代继续,而不是等待 `async.parallel` 在 NodeJS 中先完成它的执行

For loop iteration continues instead of waiting for `async.parallel` to complete its execution first in NodeJS

我正在使用 NodeJS(Express) 和异步插件。

for (var j = 0; j < totalTests; j++) {

        var caseDetailID, test, testID, testCode, testName, testTemplate, testType, testArray;



        /**
         * use async to make sure that caseDetailId(by forcing to execute first) will be available for testCaseParamter creation
         */

        test = tests[j];
        testArray = test.split(' , ');

        testID = testArray[0];
        testCode = testArray[1];
        testName = testArray[2];
        testType = testArray[3];
        testTemplate = testArray[4];

        console.log("Inside test " + testID);

        async.parallel([

            next => {
                console.log("Inside TestCaseDetail before " + testID);
                TestCaseDetails.create({
                    'case_id': case_id,
                    'test_id': testID,
                    'test_code': testCode,
                    'test_name': testName,
                    'test_type': testType,
                    'created_by': req.user.id
                }).then(row => {
                    console.log("Inside TestCaseDetail after " + testID);
                    caseDetailID = row.id;
                    next();
                });
            }
        ], (err) => { 
});

我在 tests 数组中有两个测试,testIDs 为 6 和 7。此代码在控制台中的输出顺序如下

Inside test 6
Inside TestCaseDetail before 6
Inside test 7
Inside TestCaseDetail before 7
Inside TestCaseDetail after 7
Inside TestCaseDetail after 7

这里的问题是,当 sequelize 查询开始到 运行 时,async.parallel 块终止并且 for 循环执行其迭代。现在 for 循环转到 testID 7,结果 Inside TestCaseDetail after 6 语句不会在控制台中打印,而是 Inside test 7 语句在控制台中打印。

正确的输出应该如下

Inside test 6
Inside TestCaseDetail before 6
Inside TestCaseDetail after 6
Inside test 7
Inside TestCaseDetail before 7
Inside TestCaseDetail after 7

我已经尝试过 async.series 但这并没有解决问题。

目前,我不知道async.parallel是如何工作的,所以我无法判断流程是否有问题。

但我可以建议方法,这将通过简单的方式解决您的问题 async/await:

(async () => {
    for (var j = 1; j < totalTests; j++) {
        console.log("Inside test " + j);
        await fetch(`https://jsonplaceholder.typicode.com/todos/${j}`)
            .then(response => {
                console.log("Inside TestCaseDetail after " + j, response.json());
                return response
            });
    }
})();

WORKING DEMO


您的代码应该像这样:

(async () => {
    for (var j = 0; j < totalTests; j++) {
            ...
            // async.parallel([             //<----- REMOVE
                // next => {                //<----- REMOVE
                    console.log("Inside TestCaseDetail before " + testID);
                    await TestCaseDetails.create({
                        'case_id': case_id,
                        'test_id': testID,
                        'test_code': testCode,
                        'test_name': testName,
                        'test_type': testType,
                        'created_by': req.user.id
                    }).then(row => {
                        console.log("Inside TestCaseDetail after " + testID);
                        caseDetailID = row.id;
                        // next();          //<----- REMOVE
                    });
                // }                        //<----- REMOVE
            // ], (err) => {                //<----- REMOVE
            // });                          //<----- REMOVE
    }
})();