gpt4 book ai didi

node.js - 失败请求的递归 promise

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

我有一个 main 函数,可以并行发出一系列 GET 请求。它们的状态是使用 Promise.all 函数评估的。

var promises = [];

for ( var i = 0; i < list.length; i++ )
{
promises.push( REQ( list[ i ], 0 ) );
}

var responses = await Promise.all( promises );

REQ 函数返回一个 promise 。

async function REQ( url, attempts )
{
await sleep( 5000 * attempts ); // Uses a promise with setTimeout

return new Promise( ( resolve, reject ) => {
request( url, function ( error, response, body )
{
if ( error )
{
if ( attempts > ATTEMPT_THRESHOLD )
reject( error );
else
return REQ( url, ++attempts );
}
else
{
if ( typeof body === 'undefined' || body.length === 0 )
{
if ( attempts > ATTEMPT_THRESHOLD )
reject( error );
else
return REQ( url, ++attempts );
}
else
resolve( { response, body } );
}
});
});
};

我将 REQ 函数设置为 async 的原因是,如果请求失败,则会重新尝试,但重新尝试会延迟一点以防它查询的服务器拥塞。

问题似乎是在 Node 控制台中,程序在重新尝试时挂起,这样,如果 REQ 失败,则重新尝试不会返回到原始状态REQ 并返回 promise 。

最佳答案

The re-attempt of it doesn't return to the original REQ and return the promise.

当然不是。在 new Promise 构造函数中,您需要解析 Promise,而不是返回它。

如果您在尽可能低的级别上进行 promise ,即仅包装 request request,而不是任何重试业务逻辑:

function requestAsync(url) {
return new Promise((resolve, reject) => {
request(url, (error, response, body) => {
if (error) reject(error);
else resolve({response, body});
});
});
}

然后您可以像平常一样使用 awaitreturn

async function REQ(url, attempts) {
try {
const res = await requestAsync(url);
if (typeof res.body == "undefined" || res.body.length == 0)
throw new Error("no response"); // or throw undefined to get the original behaviour
return res;
} catch(error) {
if (attempts > ATTEMPT_THRESHOLD)
throw error;
++attempts;
await sleep(5000 * attempts);
return REQ(url, attempts);
}
}

关于node.js - 失败请求的递归 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47976145/

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