努力在nodejs的for循环中使用异步等待

时间:2020-11-12 18:32:18

标签: node.js for-loop promise async-await

我正在尝试在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;
   
}

0 个答案:

没有答案