Javascript 请求承诺未处理的拒绝请求错误:错误:ETIMEDOUT
嗨,我试图通过promise请求编写一些下载函数,但是如果我有一个超时,我无法处理这个错误,我尝试了一个示例,但仍然有这个错误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
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文件程序下载,然后等待请求异常