失败请求的递归承诺

时间:2017-12-26 09:00:53

标签: node.js ecmascript-6 promise

我有一个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}}并返回承诺。

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