Jquery.deferred 구문, 동기 함수 반환 약속 만들기
-
11-12-2019 - |
문제
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