문제

Jquery.deferred를 사용하여 느린 동기 함수가 약속을 반환하도록 만드는 방법에 대한 간단한 질문입니다.지금까지 내가 한 일은 다음과 같습니다.

function sayIt(ms) {
    setTimeout( function() { console.log('what I say'); }, ms);
} 

function doIt() {
    return $.Deferred( function() { sayIt(2000); }).promise();
}


doIt().then( function() { console.log('ah'); });

sayIt(2000)은 항상 통과하지만 'then' 이후의 연결 함수는 실행되지 않습니다.

내가 이렇게 하면:

doIt().then( console.log('ah'));

'아'가 바로 나오다가 2000ms 후에 '내가 말하는 것'이 나옵니다. 물론 내가 원하는 것은 그 반대입니다. 2초 후에 '내가 말하는 것'이 나오다가 바로 '아'가 나옵니다.

어떤 제안이라도 감사하겠습니다!

도움이 되었습니까?

해결책

동기식으로 작업을 수행하지만 여전히 Promise를 사용하려면 다음을 수행하세요.

function slowPromise() {

    var def = $.Deferred();

    // do something slow and synchronous
    ...

    // resolve the deferred with the result of the slow process
    def.resolve(res);

    // and return the deferred
    return def.promise();
}

그 결과, 여전히 Promise를 받지만 그 Promise는 이미 해결되었습니다. .then() 이후에 등록된 내용은 즉시 진행됩니다.

이 패턴의 장점은 이후에 동기 코드를 비동기 코드로 바꾸더라도 함수가 여전히 동일한 외부 인터페이스를 갖는다는 것입니다.

다른 팁

제한 시간이 만료된 후에 함수를 실행하려면 다음을 호출해야 합니다. resolve()Deferred 시간 초과 만료 함수 내 개체:

function sayIt(ms) {
  var d = $.Deferred();
  setTimeout(function() {
      console.log('what I say');
      d.resolve()
    }, ms);
  return d;
}

이런 식으로 해상도를 제한합니다. Deferred 제한시간 만료에 반대합니다.

내가 믿는 바를 달성하기 위해 당신의 의도는 다음과 같습니다.

function doIt() {
  return sayIt(2000).promise()
}

그만큼 .promise() 통화는 선택 사항입니다.호출자가 사용할 수 있는 인터페이스만 제한합니다.반환함으로써 Promise 원본 대신 Deferred 호출자는 이벤트에만 반응할 수 있지만 이벤트를 트리거할 수는 없습니다.참조: http://api.jquery.com/deferred.promise/.

결국 원래 통화는 다음과 같습니다.

doIt().then( function() { console.log('ah'); });

출력됩니다:

// 2 seconds delay
what I say
ah 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top