Javascript 请求承诺未处理的拒绝请求错误:错误:ETIMEDOUT

Javascript 请求承诺未处理的拒绝请求错误:错误:ETIMEDOUT,javascript,node.js,request,bluebird,Javascript,Node.js,Request,Bluebird,嗨,我试图通过promise请求编写一些下载函数,但是如果我有一个超时,我无法处理这个错误,我尝试了一个示例,但仍然有这个错误 Unhandled rejection RequestError: Error: ETIMEDOUT at new RequestError (/home/parse/node_modules/request-promise-core/lib/errors.js:14:15) at Request.plumbing.callback (/home/par

嗨,我试图通过promise请求编写一些下载函数,但是如果我有一个超时,我无法处理这个错误,我尝试了一个示例,但仍然有这个错误

Unhandled rejection RequestError: Error: ETIMEDOUT
    at new RequestError (/home/parse/node_modules/request-promise-core/lib/errors.js:14:15)
    at Request.plumbing.callback (/home/parse/node_modules/request-promise-core/lib/plumbing.js:87:29)
    at Request.RP$callback [as _callback] (/home/parse/node_modules/request-promise-core/lib/plumbing.js:46:31)
    at self.callback (/home/parse/node_modules/request/request.js:186:22)
    at emitOne (events.js:101:20)
    at Request.emit (events.js:191:7)
    at Timeout._onTimeout (/home/parse/node_modules/request/request.js:816:16)
    at ontimeout (timers.js:380:14)
    at tryOnTimeout (timers.js:244:5)
    at Timer.listOnTimeout (timers.js:214:5)
我的代码

下载功能:

function downloadPhoto(url,uploadUrl,name){
   return new Promise(function(resolve, reject){
        rp(url,{timeout:15000},function(e){if(e) reject(e);}).on('error', function(e){return reject(e);}).pipe(fs.createWriteStream(name+'.jpg')).on('finish', () => {
        //console.log('done Download photo');
         return resolve();
    });
  });

}
调用这个函数

function sndPht(url,uploadUrl){
    return new Promise(function(resolve, reject){
      return downloadPhoto(url,uploadUrl,name).then(function(){
             ..... some logic .....  
        }).catch(function(err){
            return reject(err);
        });
}
对于许多文件,我在bluebird js映射中调用函数:

Promise.map(photos, function(photo) {
  if(photo.type === 'photo'){
    return sndPht(photo,uploadUrl);
  }  
},{concurrency: 1});

我做错了什么

您可以使用
Promise.race
来使用解析或拒绝的第一个承诺的值

使用这种技术,如果下载时间过长,我们可能会出现一个错误,该错误将在一段时间后超时。
下载照片
承诺仍将解决,但不会处理

const图像=[
{url:'www.foo.com',上载url:'/foo',名称:'foo'}
,{url:'www.bar.com',上载url:'/bar',名称:'bar'}
,{url:'www.baz.com',上载url:'/baz',名称:'baz'}
]
常量承诺超时=(延迟、承诺)=>
承诺,种族([
新承诺((解决、拒绝)=>
设置超时(解析、延迟、{
状态:“错误”,
味精:“花了太长时间!”
})
),
许诺
])
const downloadPhoto=({url,uploadUrl,name})=>
承诺超时(
1000,
新承诺((解决、拒绝)=>{
设置超时(分辨率,3000{
状态:“成功”,
msg:`这永远不会解析${url}`
})
})
)
//将图像数组[…图像]映射到[…承诺(图像)]
const imagePromises=images.map(下载照片)
//兑现所有承诺
承诺。全部(图像承诺)
//使用结果数组解析所有承诺后调用
。然后(图像=>{
//映射已解析的图像并进行进一步处理
images.map(console.log.bind(console,'Image resolved'))
})
//承诺不再拒绝,你将需要看看状态

.catch(console.log.bind(console,'Error:'))
我有一个解决方案,如果你使用请求承诺,你会呼喊create promise并返回他并捕获exeption,在我的例子中,它与管道不一样,所以我们需要像下载一样更改函数

function downloadPhoto(url){
  var options = {
      uri:url,
      timeout:10000,
      encoding: 'binary'
  };

  return rp(options);
}
然后我们可以像这样使用它

return downloadPhoto(url).then(function(file){
      fs.writeFileSync(name+'.jpg', file, 'binary');
    }).catch(function(err){
     console.log(err);
});
我们可以使用地图

Promise.map(photos, function(photo) {
  if(photo.type === 'photo'){
    return sndPht(photo,uploadUrl);
  }  
},{concurrency: 1});

但是,如果您需要downlod大文件,您需要使用calback的request什么是
sndPht
@JaromandaX对不起,upd post.所以,这是对
sndPht
返回的承诺的未经处理的拒绝issue@JaromandaX好的,thx,我能在map中处理这个承诺吗?类似于
promise.map(…你的代码…)。catch(函数(err){handleerror});
我已经更新了答案,允许您解析一组图像的承诺。您没有包含图像对象结构,所以我只是猜测。
承诺超时
现在被抽象为一个承诺。承诺将不再拒绝,因为这将导致
承诺出现问题。所有
因此您需要检查映射结束时的状态。其工作但1)u miss promiseTimeout not resolv函数on setTimeout only reject(如果时间结束,则拒绝)2)超时工作但不停止程序请求等待,然后抛出错误,如果我有多个文件,则程序工作在瞬间抛出停止,如果我有1-2文件程序下载,然后等待请求异常