Javascript setTimeout内承诺比赛立即接球
我有两个承诺,一个Javascript setTimeout内承诺比赛立即接球,javascript,timer,promise,settimeout,es6-promise,Javascript,Timer,Promise,Settimeout,Es6 Promise,我有两个承诺,一个获取和一个设置超时,获取等待5秒,设置超时等待4秒 我不知道为什么,但马上开火 myService( args ) .then( result => { console.log(result); }) .catch( timeoutError => { // <----------------- FIRE IMMEDIATELY console.error(timeoutError); }
获取
和一个设置超时
,获取等待5秒,设置超时等待4秒
我不知道为什么,但马上开火
myService( args )
.then( result => {
console.log(result);
})
.catch( timeoutError => { // <----------------- FIRE IMMEDIATELY
console.error(timeoutError);
})
;
function myService( args ){
return Promise.race([
fetch("http://localhost/wait-ten-seconds"),
new Promise( (_, timeexpired) => {
return setTimeout( function() {
console.log("timeout");
timeexpired({msg: "call timeout", code: 100, data: null});
}
, 4000)
})
]);
}
myService(args)
。然后(结果=>{
控制台日志(结果);
})
.catch(timeoutError=>{//{
返回setTimeout(函数(){
控制台日志(“超时”);
timeexpired({msg:“调用超时”,代码:100,数据:null});
}
, 4000)
})
]);
}
我用这种方法解决:我创建了一个模拟超时的函数
let activeTimer = null;
let checkTimer = (startTimer, timeExpired) => {
activeTimer = setTimeout(() => {
if( (new Date()).getTime() - startTimer < TIMEOUT_DURATION_MS ) checkTimer(startTimer, timeExpired);
else timeExpired( errorMessage.TIMEOUT_EXPIRED );
}, 1000);
};
Promise.race([
new Promise( (httpResponse, httpError) => {
return fetch(url)
.then(response => {
clearTimeout( activeTimer );
activeTimer = null;
httpResponse( response );
})
.catch( error => {
httpError( error );
})
})
,
new Promise( (_, timeExpired) => {
checkTimer((new Date()).getTime(), timeExpired);
})
]);
让activeTimer=null;
让checkTimer=(startTimer,timeExpired)=>{
activeTimer=setTimeout(()=>{
if((new Date()).getTime()-startTimer{
返回获取(url)
。然后(响应=>{
clearTimeout(activeTimer);
activeTimer=null;
httpResponse(响应);
})
.catch(错误=>{
httpError(错误);
})
})
,
新承诺((u,timeExpired)=>{
checkTimer((新日期()).getTime(),timeExpired);
})
]);
fetch等待5秒,在任何地方都看不到此消息。。。看起来像一个CORSissue@CertainPerformance它是Promise.race()
数组的第一个元素argument@PatrickEvans哦,这就是URL的delay/5000/
部分所做的,它不仅仅是一个随机路径fetch(“http://slowwly.robertomurray.co.uk/delay/5000/url/http://www.google.co.uk“
打一个GET
电话,等待5秒钟,然后responsefetch立即拒绝,并阻止跨源请求:同一源策略不允许在https://slowwly.robertomurray.co.uk/delay/5000/url/http://www.google.co.uk. (原因:CORS请求未成功)。