json - for 循环中的异步,Nodejs

标签 json node.js asynchronous request async-await

我希望 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/

相关文章:

json - 为什么结构字段显示为空?

java - 如何在android中使用 Volley 发送参数数组

node.js - 如何使用 sinon/mocha 模拟 npm 模块

javascript - 语法错误 : Unexpected Identifier (Generators in ES6)

javascript - 异步回调不可能嵌套

javascript - 检查数组中的输入值

asp.net - 将 JSON 数据转换为 VB.NET 多维数组

node.js - 如何防止 npm 安装后出现 Webpack 错误?

异步函数的Javascript返回值

c# - Android - 异步任务问题