2017-11-03 1 views
0

비동기 기능 목록이 있습니다. 첫 번째 기능이 해결 (또는 거부) 될 때, 나는 다른 사람들을 막을 수있을 것으로 기대했다. 예를 들어완료 후 다른 약속을 차단하는 방법

:

function wait(ms){ 
    return new Promise(function(resolve){ 
     setTimeout(function(){ 
      console.log('waited ', ms); 
      resolve(); 
     }, ms); 
    }) 
} 

promise1 = wait(2000); 
promise2 = wait(5000); 

listPromise = [promise1, promise2]; 

Promise.race(listPromise).then(function(){ 
    console.log("Very first promise has resolved!"); 
}) 

실제 결과는 다음

> waited 2000 
> Very first promise has resolved! 
> waited 5000 

예상 결과는 다음

> waited 2000 
> Very first promise has resolved! 
+1

를 '당신이 * 정리 * 다른 약속의 실행을 취소하고 가능하게 수행 할, 또는 당신은 단순히 돈합니까 콜백 메소드를 호출하기를 원하지만 반환 값에 대해 신경 쓰지 않더라도 실행은 계속됩니다. [이 답변] (https://stackoverflow.com/questions/30233302/promise-is-it-possible-to-force-cancel-a-promise#30235261)에서 두 가지 상황을 처리하는 방법을 잘 설명합니다. – Svenskunganka

답변

0

약속 취소되거나 중단 될 수 독립된 프로세스 아니다. 그 중 하나에서 실행중인 타이머가있는 경우 직접 멈추지 않으면 타이머가 계속 실행됩니다.

특정 문제를 해결하려면 현재 실행중인 시간 초과를 추적하고 첫 번째 문제가 해결되면 다른 모든 제한 시간을 지워야합니다. 이 같은

뭔가 작업을해야합니다 :

var timeoutIds = []; 

function wait(ms){ 
    return new Promise(function(resolve){ 
     var timeoutId = setTimeout(function(){ 
      console.log('waited ', ms); 
      resolve(); 
     }, ms); 
     timeoutIds.push(timeoutId); 
    }) 
} 

promise1 = wait(2000); 
promise2 = wait(5000); 

listPromise = [promise1, promise2]; 

Promise.race(listPromise).then(function(){ 
    console.log("Very first promise has resolved!"); 

    for (var i = 0; i < timeoutIds.length; i++) { 
     clearTimeout(timeoutIds[i]); 
    } 
}) 
+0

해답을 주셔서 감사합니다. 그러나 저는 모든 비동기 함수를 의미하며, 특별한 setTimeout이 아닙니다. 나는 Svenskunganka의 레퍼런스에서 답을 찾았습니다. – LittleZero

+0

@LittleZero 예,이 솔루션은 특별히 시간 초과를위한 것이지만 다른 작업의 경우에는 비슷합니다. 예를 들어 인스턴스를 페치 (fetch) 작업으로 유지하고이 인스턴스에서 "cancel"을 호출합니다. –

1

당신은 나중에 취소 당신의 약속에 토큰을 보낼 수 있습니다. 여기

function wait(ms, token){ 
 
    return new Promise(function(resolve){ 
 
     var t = setTimeout(function(){ 
 
      console.log('waited ', ms); 
 
      resolve(); 
 
     }, ms); 
 
     token.cancel = function(){ 
 
      clearTimeout(t); 
 
     } 
 
    }) 
 
} 
 

 
var tokens = [{},{},{}]; 
 

 
promise1 = wait(3000,tokens[0]); 
 
promise2 = wait(2000,tokens[1]); 
 
promise3 = wait(5000,tokens[2]); 
 

 
listPromise = [promise1, promise2,promise3]; 
 

 
var p = Promise.race(listPromise).then(function(){ 
 
    console.log("Very first promise has resolved!"); 
 
    for(var i = 0; i< listPromise.length; i++) 
 
     tokens[i].cancel(); 
 
})
링크 노력하고 있습니다 : 첫 번째 약속이 해결되면, https://jsfiddle.net/Lwymeoz0/

관련 문제