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
});
}
})();
您的代码应该像这样:
(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
}
})();
我正在使用 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
});
}
})();
您的代码应该像这样:
(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
}
})();