gpt4 book ai didi

node.js - 对数组中每个值的新 API 调用

转载 作者:太空宇宙 更新时间:2023-11-04 01:35:54 25 4
gpt4 key购买 nike

我基本上想要这种对象作为结果:

[{ id: 5040, requester_id: 1234, requester_name: 'John' }, { id: 5046, requester_id: 999, requester_name: 'Jim' }, { id: 5049, requester_id: 543, requester_name: 'Alex' }]

这是一个票据对象,票据有多个属性。

我正在使用的 API 有一个接收票证的调用。检索此内容没有问题。我从这个API调用中得到的信息是这样的:

[{ id: 5040, requester_id: 1234 }, { id: 5046, requester_id: 999 }, { id: 5049 requester_id: 543 }]

根据每个 requester_id,我需要执行另一个 API 调用来检索请求者的名称。对于 requester_id 1234,它给了我这个:

{ requester_id: 1234, name: 'John' }

每个请求者都需要调用自己的 API 来获取此信息。

如果 Nodejs 是一种异步编程语言,我会这样做:

var tickets = api({ method: 'get', path: '/tickets' });
for (var i=0; i<tickets.length; i++){
var contact = api({ method: 'get', path: '/contact/'+tickets[i].requester_id);
tickets[i].name = contact.name;
}

显然,这是行不通的。

我尝试过使用回调、 promise 、不同的工具来获取 API 数据(我现在的偏好是“请求”)。我实际上花了 8 个小时,但我无法让它工作。

我需要 for 循环来等待第一个 API 调用完成。然后我需要循环的每次迭代来等待前一个迭代完成。

我的 API 函数返回一个像这样的 Promise:

return new Promise(function(resolve, reject) {
request.get(options, function(err, resp, body) {
if (err) {
reject(err);
} else {
resolve(JSON.parse(body));
}
});
});

在许多不同的失败尝试中,这是最后一次:

var tickets = [];
var contacts = [];

var insertContactData = function(reqId){
return api({ method: 'get', path: '/contacts/'+reqId });
}

var main = function(){
var myTickets = api({ method: 'get', path: '/tickets');
myTickets.then(function(result) {
var ticketData = result.results;

for (var i=0; i < result.results.length; i++){
var thisTicket = {};
thisTicket.id = ticketData[i].id;
tickets[i] = thisTicket;
}
var contacts = [];
for (var i=0; i < result.results.length; i++){
var idExists = false;
for (var j=0; j < contacts.length; j++){
if (contacts[j].requesterId == tickets[i].requesterId){
idExists = true;
}
}
if (idExists == false){
var newCont = {};
newCont.requesterId = tickets[i].requesterId;
contacts.push(newCont);
}
}
contacts.shift();
for (var i=0; i < contacts.length; i++){
var pos = i;
var reqId = contacts[i].requesterId;
var contact = insertContactData(reqId);

console.log(contact);
}
}, errHandler).catch(function(error){
console.log('ERROR '+error);
});
}

请帮忙?

最佳答案

如果您需要在继续之前等待异步请求,则可以使用 async/await

async function loadTicketInfo() { 
const tickets = await api({ method: 'get', path: '/tickets' });
for (let i=0; i<tickets.length; i++){
var contact = await api({ method: 'get', path: '/contact/'+tickets[i].requester_id);
tickets[i].name = contact.name;
}
};

尽管如此,根据您期望提取的票数,这可能是一个相当慢的操作。我建议你并行拉取所有票证信息,然后在最后将这些信息结合起来

const ticketInfos = tickets.map(t => api({ method: 'get', path: '/contact/' + t.requester_id));
const infos = await Promise.all(ticketInfos);
tickets.forEach(t => {
const info = infos.find(i => i.requester_id === t.requester_id);
if (info) {
t.requester_name = t.name;
}
});

关于node.js - 对数组中每个值的新 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54640313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com