异步中的承诺

Promise inside async

我正在使用 Node.js 编写代码。我想解析 JSON 数组,从 JSON 数组中检索元素,进行数据库调用并将值赋给 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

如果您是 运行 节点 8.x+,则可以使用 async/await。以下 for...in 应等待 promise 完成,然后再迭代到下一项。

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