2016-10-16 15 views
2

이 약속 체인이 있습니다.체인에 .catch가 있지만 노드 6을 사용하여 UnhandledPromiseRejectionWarning이 발생했습니다.

com.openPort(port).then(port => { 
         _.pTimeout(3000, com.sendPort(port, NCD.gen(args.cmd))) 
          .then(received => { 
           console.log('complete response: ', NCD.parse(received)); 
           Debug.L1('resolved num data listeners: ', port.listenerCount("data")); 
          }) 
        }) 
        .catch(function(e) { 
         console.log('error: ', e) 
        }); 

와 나는 sendPort 약속이 해결되지 않은이 될 것 가짜 명령을 전송하여 제한 시간 약속을 테스트하고 있습니다. 타임 아웃 약속은 경주에서 승리를 거두지 만, 경고는 .catch가 거부를 처리하기 전에옵니다. 여기

는이기는하지만 ... 콘솔

(node:9616) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): 
    Timed out 

당신이이 처리되었습니다 있도록 콘솔에 "시간이 초과되었습니다"는 .catch 퍼팅 경고 후 볼 수 있습니다 보여줍니다

pTimeout: function(timeout, promise) { 
     return Promise.race([ 
      promise, 
      new Promise(function(resolve, reject) { 
       setTimeout(function() { 
        reject('\nTimed out'); 
       }, timeout); 
      }) 
     ]); 
    } 

제한 시간 약속 경주입니다 부적절하게 ??

다른 게시물에서 보이는 노드 6을 사용 중이며, 첫 번째 틱에서 처리되지 않으면 경고 메시지를 표시합니다. 나는 그것들을 어떻게 고칠 수 있을지 상상할 수 없다. 어떻게 처리해야합니까? 나는 타임 아웃 약속 후에 .catch를 넣으려고했지만 여전히 .catch 전에 경고를 받는다.

답변

2

_.pTimeout()에 의해 반환 된 약속이 고아가되고 거부가 처리되지 않습니다. 이들을 처리하려면 해당 특정 약속에 .catch()이 필요하거나 return을 추가하여 부모 약속에 연결되어 높은 수준 .catch()에 걸릴 수 있습니다. 당신이 거의 자신의 페이스대로 진행하고 부모 약속에 전혀 연결되지 않는다는 약속을 원했기 때문에 돌아 오는/체인을 제안하는 것이 좋습니다.

com.openPort(port).then(port => { 
    return _.pTimeout(3000, com.sendPort(port, NCD.gen(args.cmd))).then(received => { 
     console.log('complete response: ', NCD.parse(received)); 
     Debug.L1('resolved num data listeners: ', port.listenerCount("data")); 
    }); 
}).catch(function (e) { 
    console.log('error: ', e) 
}); 
+0

예. 아직도 내가 고아가 된 이유를 이해한다면, 나는 이것을 다시 피할 것이다. 그것은 첫 번째 약속 결의안의 "내부"에 있기 때문입니까? 그것이 내가 약속을 중첩 할 때 그들은 모두 돌아가 선발되어야한다. 그렇지 않으면 그들 (그리고 그들 안의 어떤 것)이 고아가 될 것인가? – DKebler

+0

@DKebler - 예. 약속에는 마술이 없습니다. 그들은'.then()'핸들러에 무엇이 있는지에 대해 아무것도 모른다. 그래서, 거기에 또 다른 약속이 있다면 부모 약속에 연결하는 유일한 방법은'.then()'핸들러에서 그것을 반환하는 것입니다. 부모 약속이 해결되기 전에 부모 약속이 해결 될 때까지 기다려야합니다. '.then() '핸들러에서 아무것도 반환하지 않으면, 부모 약속은 자식 약속을 전혀 알지 못하며 자식 약속은 스스로 남겨 둡니다. – jfriend00

+0

나는 그것을 지금 얻는다! 그들은 그 최고치까지 버블 링 할 방법이 필요합니다. 이것은 또한 이처럼 단지 하나의 둥지에 대한 과잉 공격 일 가능성이있는 체인을 평평하게하는 아주 좋은 기사를 더 잘 이해하는 데 도움이되지만 약속을 되 돌리는 것은 어떤 가치를 되돌려주는 것과는 다릅니다. Thx https://github.com/ThomasBurleson/angularjs-FlightDashboard – DKebler