首页 > 解决方案 > 节点js中的for循环异步

问题描述

嗨,我的节点 js 应用程序中有一个 for 循环,它调用异步函数。我想检查一个值并确定是否找到了客户。但是循环迭代直到最后一个元素。因此我的错误循环不起作用。我希望循环检查响应,然后迭代下一个循环。

for循环:

for (let i = 0; i < customerlookupresponse.data.length; i++) {
    var customer = customerlookupresponse.data[i];
    if (customer != undefined) {
        console.log("customer.id :: " + customer.id)
        var accountlookUpData = {
            customerId: customer.id
        };
        customerAccountLookUpRequest(accountlookUpData).then(data => {
            console.log("----" + i + " -- " + data);                               
            if (data && data.status === 1) {
                resolve(data);
                return;
            }else{
                reject({
                    status: 404,
                    message: "Customer not found"
                });
                return;
            }
        });
    } else {
        reject({
            status: 404,
            message: "Customer not found"
        });
        return;
    }
}

异步函数:

async function customerAccountLookUpRequest(customerLookUpData) {
    var accountLookUp = config.app.url;
    let data = await axios.get(accountLookUp).then(accountLookUpResult => {
        for (i = 0; i < accountLookUpResult.data.length; i++) {
            var requestaccount = accountLookUpResult.data[i].accountNumber;
            if (requestaccount == customerLookUpData.lookupAccount) {
                accountLookUpResult.data[i].customerId = customerLookUpData.customerId;
                accountLookUpResult.data[i].status = 1;
                return accountLookUpResult.data[i];
            }
        }
    });
    return data;
}

我是节点 js 的新手,并试图理解异步等待的概念。请帮忙。

标签: javascriptnode.jsasync-await

解决方案


异步函数等待 Promise 返回。具有循环的函数应声明为 async,并且 customerAccountLookUpRequest 函数应返回一个承诺。然后使用 await 运算符调用该函数。简单的例子:

class some_class {

    constructor() {
    }

    async my_loop() {
        let _self = this;
        for (let i = 0; i < customerlookupresponse.data.length; i++) {
            let data = await _self.customerAccountLookUpRequest(accountlookUpData);
            console.log("----" + i + " -- " + data);
        }
    }

    customerAccountLookUpRequest(customerLookUpData) {
        return new Promise((resolve, reject) => {
            axios.get(accountLookUp).then(accountLookUpResult => {
                resolve(accountLookUpResult);
            });
        });
    }
}

推荐阅读