2014-09-01 6 views
2

의 차이는이 코드가 작동하지만 :Q 약속. .when과 그 때는

var promise = function(val) { 

    var _val = val; 

    return setTimeout(function(_val) { 

     var newVal = val/10; 

     return { 
      newVal : newVal, 
      message : 'it just to be a ' + val 
     }; 
    }, 3000); 
}; 

Q.when(promise(400)).then(function(obj) { 
    return console.log('jaaaaj !', obj); 
}, function() { 
    return console.log('no yet...'); 
}); 

JSFiddle

내 생각이 같았 네 초 후에 그 작업을 마칠에서는 setTimeout 때, Q 라이브러리는 처음 콜백에서 수익을 잡을 것 두 가지 속성 (newVal : 4message : 'it just to be a ' + 400)을 가진 객체를 보여줍니다. 대신 성공 콜백에서 obj로 이상한 1 숫자가 있습니다 ...

BTW Q 라이브러리에서 .when.then의 차이점은 무엇입니까?

+0

비동기이기 때문에'setTimeout'에서 실제로 아무것도 반환 할 수 없습니다. 또한 컨텍스트 (그리고 받아 들인 args)에서 'when'이 약속을 래핑하여 'then'이 연결될 수 있도록 콜백을 시작한다는 것이 분명해진다. 약속이 해결되었을 때. – Mathletics

답변

8

.when()은 인수로 하나 이상의 약속을 취합니다. 타이머 핸들을 전달하면 즉시 .then() 처리기가 실행됩니다.

.when()에는 전달한 항목이 완료되면이를 식별 할 수있는 마법 능력이 없습니다. 약속을 하나 이상 전달해야하며 약속이 언제 풀리는 지 모니터링합니다.

또한 setTimeout()에서 아무 것도 반환 할 수 없지만 setTimeout() 내에서 약속을 해결하면 .resolve() 방법으로 데이터를 전달할 수 있습니다. 당신은 하나의 약속이있을 때, 당신도 Q.when() 필요하지 않습니다,

var promise = function(val) { 
    var defer = Q.defer(); 

    setTimeout(function() { 

     var newVal = val/10; 

     defer.resolve({ 
      newVal : newVal, 
      message : 'it just to be a ' + val 
     }); 
    }, 3000); 

    // return the promise 
    return defer.promise; 
}; 

Q.when(promise(400)).then(function(obj) { 
    return console.log('jaaaaj !', obj); 
}, function() { 
    return console.log('rejected...'); 
}); 

을하지만 :

은 당신이 뭔가를 할 수 있습니다. 다음과 같이하면됩니다 :

promise(400).then(function(obj) { 
    return console.log('jaaaaj !', obj); 
}, function() { 
    return console.log('rejected...'); 
}); 
+0

"setTimeout()에서 아무것도 반환 할 수 없습니다."- 정확하지만 비슷하게 setTimeout에 아무 것도 전달할 수 없습니다. setTimeout 함수 내에서 사용되는 모든 객체/값은 "자체 생성"(예 : var foo = 99;) 또는 함수 (반드시 setTimeout 자체 일 필요는 없음)가 작성된 어휘 환경에서 가져와야합니다. 따라서'setTimeout (function (_val) {'은'setTimeout (function() {'과'var _val = val; '행을''val''이 setTimeout의 함수 내부에서 자동으로 접근 할 수 있기 때문에 다시 쓸 수 있습니다. –

+0

예, setTimeout의 함수에서 값/객체를 사용할 수있게하는 세 번째 방법은 [Function.prototype.bind()] (https : //)를 사용하는 것입니다. "미리 전달 된"매개 변수 (및 컨텍스트)가있는 새 함수를 반환하는 –

+0

@ Roamer-1888 - you (개발자.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) 인수를'setTimeout()'콜백에 직접 전달하지 않는 것에 대해서는 정확합니다. 원래 OP의 코드에서는 보지 못했지만, 다행히도 선언 된 인수를 사용하지 않았습니다. 내 대답에있는 코드에서 그것을 제거했습니다.이 경우에는 val을 얻기 위해 직접 부모 범위에 액세스 할 수 있으므로 아무 것도 전달하지 않아도됩니다. 예, '.bind()'는이 인스턴스에서는 필요하지 않지만 사용할 수 있습니다. – jfriend00