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请求未成功)。