gpt4 book ai didi

node.js - Nodejs 异步/等待嵌套 API 进度

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:49 25 4
gpt4 key购买 nike

我有一个 API,可以搜索用户提供的术语,返回结果数组,然后为每个结果触发异步请求,并获取第二批请求中每个请求的结果。我希望 API 在发生时报告进度,而不仅仅是最终结果。因此,如果我执行以下请求,我应该会得到这样的更新

$ curl 'http://server/?q=foobar'
searching for ${q}…
found 76… now getting images…
found 30 images… done
{
result
}

大部分相关代码如下所示。 Fwiw,我正在为我的应用程序使用 hapijs

let imagesOfRecords = {};

const getImages = async function (q) {

console.log(`searching for ${q}…`);
const uri = `http://remoteserver/?q=${q}`;
const {res, payload} = await Wreck.get(uri);
const result = JSON.parse(payload.toString()).hits;
const numOfFoundRecords = result.total;

if (result.total) {

console.log(`found ${result.total}… now getting images…`);
const foundRecords = result.hits.map(getBuckets);
Promise.all(foundRecords).then(function() {

console.log(`found ${Object.keys(imagesOfRecords).length} images… done`);
reply(imagesOfRecords).headers = res.headers;
}).catch(error => {
console.log(error)
});
}
else {
console.log('nothing found');
reply(0).headers = res.headers;
}
};

const getBuckets = async function(record) {

const { res, payload } = await Wreck.get(record.links.self);
const bucket = JSON.parse(payload.toString()).links.bucket;
await getImageFiles(bucket, record.links.self);
};

const getImageFiles = async function(uri, record) {

const { res, payload } = await Wreck.get(uri);
const contents = JSON.parse(payload.toString()).contents;
imagesOfRecords[record] = contents.map(function(el) {
return el.links.self;
});
};

一旦我可以实现这一点,我的下一个任务就是在使用上述 API 的网络应用程序中实现此渐进式更新。

最佳答案

要显示后端请求的每个步骤的结果,您可以使用 EventEmitter,它将在每个进度步骤上发出事件。您可以阅读有关事件 here .
简单实现:

const events = require('events');
const eventEmitter = new events.EventEmitter();

//your request code
Promise.all(foundRecords).then(function() {
console.log(`found ${Object.keys(imagesOfRecords).length} images… done`);
eventEmitter.emit('progress');
reply(imagesOfRecords).headers = res.headers;
})

const eventReaction = (e) => {
// do something with event, console log for example.
}
eventEmitter.on('progress', eventReaction);

您可以找到更多示例herehere
要向客户端显示事件,您可以使用库 socket.io 。我认为您可以在documentation中找到非常简单的解释socket.io如何工作。 .
如果您想在服务器或进程之间发送事件并且想进一步了解,您可以阅读有关 0MQ(零 mq)及其 Node implementation 的更多信息。

关于node.js - Nodejs 异步/等待嵌套 API 进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47937206/

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