承诺内部异步

时间:2018-05-31 12:49:23

标签: node.js async.js

我正在使用Node.js编写代码。我想解析JSON数组,从JSON数组中检索元素,进行db调用并为JSON数组赋值。以同步方式完成此完整操作。为此,我使用for循环编写代码:

for (let i = 0; i < items.length; i++) {
    if(items[i].type === 'PickSimple'){
        operation(item.searchSpec)
        .then(lov => {
            items[i].listOfValues = lov;
        })
        .catch(err =>{
            console.log(err);
        });
    }   
}

console.log("Final OBJ : "+items)

function operation(lov) {
return new Promise((resolve, reject) => {
    Listofvalue.find({type: lov}, function(err, listofvalues) {    
        if (err) {
            return reject(err);    
        } 
        return resolve(listofvalues);            
    });
});

但节点是异步的,我没有得到理想的结果。所以我使用了async

async.each(items,
    function(item,callback) {
        if(item.type === 'PickSimple'){
            operation(item.searchSpec)
            .then(lov => {
                item.listOfValues = lov;                
            }).catch(err =>{
                console.log(err);
            });                 
        }
    }, err => {
        if (err) console.error(err.message);        
    }
);

我也尝试过使用async.forEachOf 我仍然没有得到理想的结果。什么遗失了?

修改

async function processArr(items){
    console.log("Inside processArr "+JSON.stringify(items));
    for(const item in items){
        console.log("Inside for loop, item : "+item);
        if(item.type === 'PickSimple'){
            var listOfValues = await operation(item.searchSpec)
            item.listOfValues = listOfValues;
        }  
    }
    console.log("ProcessArr Final OBJ : "+JSON.stringify(items));
}

输出:

Inside processArr [{"name":"Call Related To","type":"PickSimple","searchSpec":"TM_CALL_RELATED_TO_SERVICE"},{"name":"Disposition Codes","type":"Text","searchSpec":""},{"name":"VOC 1","type":"Text","searchSpec":""}]
Inside for loop, item : 0
Inside for loop, item : 1
Inside for loop, item : 2

1 个答案:

答案 0 :(得分:2)

如果您正在运行Node 8.x +,则可以使用async / await。以下for...in应等待承诺在迭代到下一个项目之前完成。

PS。我没有测试过这种方法,请告诉我它是否适合你。

async function processArr(items){
    for(const item in items){
        if(items[item].type === 'PickSimple'){
            var listOfValues = await operation(items[item].searchSpec)

            items[item].listOfValues = listOfValues;

        }  
    }

    console.log("Final OBJ : "+items)
}

编辑:

由于您在console.log内呼叫console.log,您未定义。