gpt4 book ai didi

javascript - Node.js 异步,但仅处理第一个肯定/定义的结果

转载 作者:行者123 更新时间:2023-11-28 19:02:08 25 4
gpt4 key购买 nike

创建并行异步 HTTP 请求并获取第一个返回肯定结果的最佳方法是什么?我熟悉 JavaScript 的异步库,并且很乐意使用它,但不确定它是否正是我想要的。

背景 - 我有一个 Redis 存储作为服务器的状态。我们可以调用一个 API 来获取一些数据,这些数据比到达 Redis 存储所需的时间要长得多。

在大多数情况下,数据已经存在于 Redis 存储中,但在某些情况下,数据尚不存在,我们需要从 API 中检索它。

简单的做法是查询 Redis,如果 Redis 中没有该值,则随后转到 API。但是,如果数据尚未在 Redis 缓存中,并且在使用 Redis 找不到数据后我们必须访问 API,那么我们将不必要地损失 20-50 毫秒。由于这个特定的 API 服务器负载并不大,因此同时/并行访问 API 并不会造成什么影响,即使我们绝对不需要返回值。

//下面的伪代码

async.minimum([

function apiRequest(cb){
request(opts,function(err,response,body){
cb(err,body.result.hit);
}
},
function redisRequest(cb){
client.get("some_key", function(err, reply) {
cb(err,reply.result.hit);
});
}],

function minimumCompleted(err,result){

// this mimimumCompleted final callback function will be only fired once,
// and would be fired by one of the above functions -
// whichever one *first* returned a defined value for result.hit


});

有没有办法通过异步库或 promise 来获得我正在寻找的东西,或者我应该自己实现一些东西?

最佳答案

使用Promise.any([ap, bp])

以下是一种没有 promise 的可能方法。未经测试,但应该满足要求。

为了满足返回第一个成功而不仅仅是第一个完成的要求,我保留了预期完成的数量,以便如果发生错误,可以忽略它,除非它是最后一个错误。

function asyncMinimum(a, cb) {
var triggered = false;
var completions = a.length;
function callback(err, data) {
completions--;
if (err && completions !== 0) return;
if (triggered) return;
triggered = true;
return cb(err, data);
}
a.map(function (f) { return f(callback); });
}


asyncMinimum([

function apiRequest(cb){
request(opts,function(err,response,body){
cb(err,body.result.hit);
}
},
function redisRequest(cb){
client.get("some_key", function(err, reply) {
cb(err,reply.result.hit);
});
}],

function minimumCompleted(err,result){

// this mimimumCompleted final callback function will be only fired once,
// and would be fired by one of the above functions -
// whichever one had a value for body.result.hit that was defined

});

关于javascript - Node.js 异步,但仅处理第一个肯定/定义的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32323611/

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