我有一个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
函数返回一个承诺。
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
的原因是,如果请求失败,则会重新尝试,但是如果服务器重新尝试会延迟一点它的查询很拥挤。
问题似乎是在节点控制台中,程序会在重新尝试时挂起,这样如果REQ
失败,重新尝试它就不会返回到原始{ {1}}并返回承诺。
答案 0 :(得分:2)
重新尝试它不会返回原始REQ并返回承诺。
当然不是。在Foo
构造函数中,您需要new Promise
承诺而不是resolve
。
如果你在尽可能低的级别上进行宣传会更好,即只包装return
和 request
,而不是任何重试业务逻辑:
request
然后您可以照常使用function requestAsync(url) {
return new Promise((resolve, reject) => {
request(url, (error, response, body) => {
if (error) reject(error);
else resolve({response, body});
});
});
}
和await
。
return