여기의 많은 답변은 이 기사 의 마지막 예와 비슷합니다 . 여러 약속을 캐싱하고 있으며 resolve()
및 reject()
기능을 모든 변수 또는 속성에 할당 할 수 있습니다. 결과적 으로이 코드를 약간 더 작게 만들 수 있습니다.
function defer(obj) {
obj.promise = new Promise((resolve, reject) => {
obj.resolve = resolve;
obj.reject = reject;
});
}
다음은이 버전을 사용하여 로드 약속을 다른 비동기 프로세스와 defer()
결합 하는 간단한 예입니다 FontFace
.
function onDOMContentLoaded(evt) {
let all = []; // array of Promises
glob = {}; // global object used elsewhere
defer(glob);
all.push(glob.promise);
// launch async process with callback = resolveGlob()
const myFont = new FontFace("myFont", "url(myFont.woff2)");
document.fonts.add(myFont);
myFont.load();
all.push[myFont];
Promise.all(all).then(() => { runIt(); }, (v) => { alert(v); });
}
//...
function resolveGlob() {
glob.resolve();
}
function runIt() {} // runs after all promises resolved
업데이트 : 객체를 캡슐화하려는 경우 2 가지 대안 :
function defer(obj = {}) {
obj.promise = new Promise((resolve, reject) => {
obj.resolve = resolve;
obj.reject = reject;
});
return obj;
}
let deferred = defer();
과
class Deferred {
constructor() {
this.promise = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}
}
let deferred = new Deferred();
Promise
은 두 함수를 "내보내기"할 수 있도록 동 기적으로 실행되어야 한다고 지정 되어 있습니다.