繁体   English   中英

如何从节点js中的数组有效地进行多个api调用

[英]How to efficiently make multiple api calls from an array in node js

我有以下代码片段可以进行多个 api 调用

var userdetails:any=[]
for(var i=0;i<userids.length;i++)
            {
                               userdetails.push(await this.getUserData(authToken,userid[i]))
            }

getUserData function的实现如下

async getUserData(authtoken,userid) {
        return new Promise((resolve, reject) => {
        
            const url = `https://***********/***/users?id=userid`;
            const requestOptions = {
                url,
                method: 'GET',
                headers: {
                    'Authorization': authtoken,
                }
            };
            request(requestOptions, (err, response, body) => {
                let errorMessage = 'Error in getting data';
                if (err) {
                    
                    return reject(err);
                }

                if (!response) {
                    
                    return reject({
                        message: errorMessage
                    });
                }

                if (response.statusCode === 200) {
                    
                    try {
                        body = JSON.parse(body);
                    } catch (err) {
                        
                        reject({ message: errorMessage });
                    }
                    if (isArray(body)) {
                        let newArray: any = [];
                        body.forEach(element => {
                            newArray.push({         
                                userId:element["userId"],
                                username:element["username"],
                                
                            });
                        });
                        return resolve(newArray);
                    } else {
                        return resolve(body);
                    }
                }

                if (response.statusCode >= 400) {
                    return reject({
                        message: errorMessage
                    });
                }
            });
        });
    }

上面的代码可以正常工作并返回所有数据。 但是其中存在性能故障,并且随着用户ID数量的增加,返回数据需要花费大量时间。 我已经在使用异步等待方法。 我还能如何实现它来调整此代码的性能?

您应该使用Promise.all()Promise.allSettled()而不是一一等待它们。 它应该使程序更快。

例子:

const requests = [];

for (let i = 0; i < userids.length; i++) {
    requests.push(this.getUserData(authToken, userid[i]));
}

const userdetails = await Promise.all(requests);

并尝试使用一些内置 promise 支持的库。 它们将使您的代码更简单、更清晰。 我可以推荐使用axiosnode-fetch 他们都支持承诺。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM