gpt4 book ai didi

javascript - 进行多个 Http 调用并将结果与​​ Promise 合并

转载 作者:行者123 更新时间:2023-12-02 14:52:35 25 4
gpt4 key购买 nike

好吧,我发现类似的问题可以回答我的问题,但不完全正确。

示例:

Nodejs making parallel http calls and consolidate the result

Node.js - wait for multiple async calls

我有 8 个函数,它们做同样的事情,除了点击不同的 api 端点。在这些函数中,我查看响应并选择我想要的内容并返回。然后我有一个使用 bluebird 的函数立即调用所有电话并等待他们的回复。

这就是 8 个函数中的 1 个的样子(几乎只是交换它所调用的 api)。

function getMorphite(){
request.get(crestMarketHistoryMorphite , function (error, response, body) {
if (!error && response.statusCode === 200) {
var content = JSON.parse(body);
var topMorphiteBuy;
var maxBuy = 0;
for(var i = 0; i < content.items.length; i++){
var item = content.items[i];
if(item.location.id == 60003760){
var buyPrice = item.price;
if(buyPrice > maxBuy){
maxBuy = buyPrice;
topMorphiteBuy = item;
}
}
}
console.log(topMorphiteBuy);
return topMorphiteBuy
} else {
console.error(error);
return error;
}
});
}

这是我的函数,它获取我的所有函数,运行它们,并获取它们的响应。

exports.getSearchResults = function (req, res) {
var allItems = [];
Promise.all([getTritanium(), getPyrite(), getMexallon(), getIsogen(), getNocxium(), getZydrine(), getMegactye(), getMorphite()]).then(function (response) {
console.log("Response", response);
allItems.push(response[0]);
allItems.push(response[1]);
allItems.push(response[2]);
allItems.push(response[3]);
allItems.push(response[4]);
allItems.push(response[5]);
allItems.push(response[6]);
allItems.push(response[7]);
res.type('application/json');
res.json(allItems);
});
};

所以这“有效”,但我遇到了一些返回问题。现在的响应是一个包含 8 个未定义项的数组。我在这里到底想念什么。这一定是一个返回问题,但我觉得我已经 panic 地切换了所有返回语句,但没有运气。

最佳答案

Promise.all()如果您向其传递一个 promise 数组,其中每个 promise 都链接到相应的操作,则仅等待异步操作。现在,您正在向它传递一个 undefined 的数组。值,因为您的 getMorphite()函数和其他类似的函数实际上不会返回任何内容。 return来自 ``request.get() callback happen after 内部的语句getMorphite() has already long since returned and those return values just go back into the bowels of the request()` 实现并被忽略。

因为你正在通过Promise.all()未定义值的数组,它不会等待任何内容,也不会得到任何结果。因此,它称之为 .then()立即处理程序,除了 undefined 数组之外什么也没有。其结果的值。

如果您想使用Promise.all()为此(这是适合这项工作的正确工具),那么您需要“ promise ”您的request()操作,因此它们返回一个 promise ,当异步操作完成时,该 promise 将通过最终结果得到解决。然后,Promise.all()将得到一系列 promise 和 Promise.all().then()将等待所有 promise 完成,并将获得这些 promise 的一系列结果。

如果您使用的是 Bluebird,则可以使用它来 Promisify request.get()操作如下:

 var request = Promise.promisifyAll(request, {multiArgs: true});

这个“promisifyAll”步骤向 request 添加了新方法带有“Async”后缀的对象,所以 request.get()获取名为 request.getAsync() 的伴随方法。新的“异步”版本返回一个 promise 。通常不需要 multiArgs 选项,但在这种情况下,因为 request.get()返回多个数据参数(这不是通常的 Node 异步调用约定),这里需要它。

而且,这是 getMorphite() 的实现返回一个 promise 并返回最终值作为 promise 的履行值。

function getMorphite() {
return request.getAsync(crestMarketHistoryMorphite).spread(response, body) {
if (response.statusCode === 200) {
var content = JSON.parse(body);
var topMorphiteBuy;
var maxBuy = 0;
for (var i = 0; i < content.items.length; i++) {
var item = content.items[i];
if (item.location.id == 60003760) {
var buyPrice = item.price;
if (buyPrice > maxBuy) {
maxBuy = buyPrice;
topMorphiteBuy = item;
}
}
}
console.log(topMorphiteBuy);
// return this to make it the fulfilled value of the promise
return topMorphiteBuy;
} else {
// reject the promise with bad status code
throw new Error("response.statusCode was: " + response.statusCode)
}
});
}

如果您将其他函数更改为也以这种方式工作,则可以使用原始代码,如下所示:

Promise.all([getTritanium(), getPyrite(), getMexallon(), getIsogen(), 
getNocxium(), getZydrine(), getMegactye(), getMorphite()])
.then(function (response) {
console.log("Response", response);
allItems.push(response[0]);
allItems.push(response[1]);
allItems.push(response[2]);
allItems.push(response[3]);
allItems.push(response[4]);
allItems.push(response[5]);
allItems.push(response[6]);
allItems.push(response[7]);
res.type('application/json');
res.json(response);
});

关于javascript - 进行多个 Http 调用并将结果与​​ Promise 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36074860/

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