【发布时间】:2017-12-26 09:00:52
【问题描述】:
我有一个 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 的原因是,如果请求失败,它会重新尝试,但如果它正在查询的服务器拥塞,重新尝试会延迟一点。
问题似乎是在 Node 控制台中,程序在重新尝试时挂起,这样如果 REQ 失败,它的重新尝试不会返回到原来的 REQ 并返回承诺。
【问题讨论】:
-
尝试用
while循环实现同样的逻辑
标签: node.js ecmascript-6 promise