我希望 for 循环按顺序运行,完全完成一个循环,然后再进入下一个循环。该循环将一条 JSON 消息放入另一条 JSON 消息中,然后将其发送到一个开始发布到 api 的函数。我需要先完成该函数,然后再继续处理 JSON 中的下一项。 p 是项目名称,用于回发是否已通过 api 服务成功发布到数据库。
这是针对此问题简化的代码。
let processJson = function(items) {
for (const p in items) {
let newObj = {
"key1": items[p].key1,
"key2": items[p].key2,
"keySpecial": items[p].key3 + items[p].key4
};
await validateJson(p, newObj);
}
};
我需要 validateJson 完成其异步工作链,然后再继续循环中的下一个 p。
我该怎么做?
这是请求的 validateJson 函数。
const validateJson = function (id, jsonObj) {
const processItemSchema = {
"properties": {
"key1": {
"type": "string"
},
"key2": {
"type": "string",
"minLength": 3,
"maxLength": 3
},
"keySpecial": {
"type": "string",
"minLength": 4,
"maxLength": 4
}
}
};
const ajv = new Ajv();
let validate = ajv.compile(processItemSchema);
let valid = validate(jsonObj);
if (!valid){
resCallback(id + ": invalid JSON");
}
else{
// Generate Special Flag(s) value, Comma Separated Value
let specialFlag = "";
specialFlag += specialCheck1(jsonObj.keySpecial);
if(specialFlag.length > 0) {
let temp = specialCheck2(jsonObj.keySpecial);
if (temp.length > 0) {
specialCheck += "," + temp;
maintenanceCall(id, jsonObj, specialFlag);
}
else {
mainenanceCall(id, jsonObj, specialFlag);
}
}
else {
specialFlag += specialCheck1(jsonObj.keySpecial);
maintenanceCall(id, jsonObj, specialFlag);
}
}
};
根据要求提供更多代码
const maintenanceCall= function (id, jsonObj, specialFlag) {
request.post({
url: 'https://url.poster/something',
auth: {
'user': 'user',
'pass': 'pass',
'sendImmediately': true
},
json: true,
body: {
"Input": {
"InputParameters": {
"KEY": jsonObj.key1,
"Hole": jsonObj.Key2,
"SomeWhere": jsonObj.keySpecial
}
}
}
}
, function (error, response, body) {
if (body.OutputParameters.X_MSG_DATA !== null) {
resCallback(id + , Message: "
+ body.OutputParameters.DATA);
}
else {
const sampCheck = function(smsFlag){
if(flag=== "Y")
return ".X";
else if(flag=== "N")
return "";
else
resCallback(id + ": this item can not be processed");
processItem(id, jsonObj, stats);
}
}
});
};
最佳答案
您可以使用 Node 异步循环 https://www.npmjs.com/package/node-async-loop
var asyncLoop = require('node-async-loop');
var array = ['item0', 'item1', 'item2'];
asyncLoop(array, function (item, next)
{
do.some.action(item, function (err)
{
if (err)
{
next(err);
return;
}
next();
});
}, function (err)
{
if (err)
{
console.error('Error: ' + err.message);
return;
}
console.log('Finished!');
});
关于json - for 循环中的异步,Nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52268071/