首页 > 解决方案 > 努力在nodejs的for循环中使用异步等待

问题描述

我试图在 for 循环中使用多个函数,但是,一个返回未定义(或不​​等待?)

代码如下:

var arrNew = [];
var id = [];
var get1 = [];
var get2 = [];
var get3 = [];
var res = [];
var get4 = [];
for (j = 0; j < arrNew.length; j++) {
    id[j] = arrNew[j];
    get1[j] = await get1Fun(context, id[j]);
    if (get1[j] !== false) {
        get2[j] = await get2Fun(context, get1[j]);
        context.log(get2[j]);
        if (get2[j].length) {
            get3[j] = await get3Fun(context, get2[j]);
            if (get3[j] !== false && get3[j].status == 200) {
                res[j] = get3[j].result;
                get4[j] = await get4Fun(context, id[j], res[j]);
                context.log(get4[j])
            }
        }
    }
}
async function get1Fun(context, id) {
    const querySpec = {
        query: `SELECT * FROM r where r.id = "${id}"`,
    };
    const { resources } = await client.database(databaseId).container(containerId).items.query(querySpec).fetchAll();
        if (resources.length == 1) {
            return resources[0];
        } else if (!resources.length) {
            return false;
        }
}

function get2Fun(context, getInt) {
    return new Promise((resolve, reject) => {
        var msg = []
        // do for loop stuff with getInt and push stuff into msg
         
        context.log(msg)
        resolve(msg);
    });
}

代码一直运行到 get2Fun 返回 undefined 或 if (get2[j].length)不等待await get2Fun.

有人可以澄清出了什么问题吗?

我尝试过使用异步功能但没有承诺。

我有如下数组的原因是,如果我将函数构造为,var get1 = await get1Fun(context, id)那么 for 循环将在 1 或 2 个项目后停止,而不是在arrNew.

提前致谢。

编辑:

还尝试了以下方法,但 for 循环在 1 个循环后停止(可能是每个循环重新定义变量的问题?):

for (j = 0; j < arrNew.length; j++) {
    var id = arrNew[j];
    var get1 = await get1Fun(context, id);
    if (get1 !== false) {
        var get2 = await get2Fun(context, get1);
        context.log(get2);
        if (get2.length) {
            var get3 = await get3Fun(context, get2);
            if (get3 !== false && get3.status == 200) {
                var res = get3.result;
                var get4 = await get4Fun(context, id, res);
                context.log(get4)
            }
        }
    }
}
async function get1Fun(context, id) {
    const querySpec = {
        query: `SELECT * FROM r where r.id = "${id}"`,
    };
    const { resources } = await client.database(databaseId).container(containerId).items.query(querySpec).fetchAll();
        if (resources.length == 1) {
            return resources[0];
        } else if (!resources.length) {
            return false;
        }
}



   async function get2Fun(context, getInt) {

    
        var msg = []
        // do for loop stuff with getInt and push stuff into msg
         
        context.log(msg)
        return msg;
   
}

标签: node.jsfor-looppromiseasync-await

解决方案


推荐阅读