사용자 정의promise의 실현
/* Promise */
function Promise() {
this.queues = [];
this.fails = [];
this.progress = [];
this.nextVal = null;
this.nextErr = null;
}
Promise.prototype.then = function ( onFulfilled, onRejected, progress) {
this.done.call(this, onFulfilled);
if (Object.prototype.toString.call(onRejected) == "[object Function]") {
this.fail.call(this, onRejected);
}
if (Object.prototype.toString.call(progress) == "[object Function]") {
this.progress.call(this, progress);
}
return this;
};
Promise.prototype.done = function (func) {
this.queues.push(function(data) {
this.nextVal = func.call(null, data);
});
return this;
};
Promise.prototype.fail = function (func) {
this.fails.push( function(err) {
this.nextErr = func.call(null, err);
});
};
/* Deferred */
function Deferred() {
this.status = 'pending';
this.promise = new Promise();
}
Deferred.prototype.resolve = function ( data) {
if (this.status == 'pending') {
this.promise.queues.forEach(function(func, i) {
func.call(this, this.nextVal || data);
}, this.promise);
this.status = 'fulfilled';
}
};
Deferred.prototype.reject = function(err) {
if (this.status == 'pending') {
this.promise.fails.forEach(function(func, i) {
func.call(this, this.nextErr || err);
}, this.promise);
this.status = 'rejected';
}
};
Deferred.when = function () {
var promises = Array.prototype.slice.call(arguments, 0), results = [], start = 0, total = promises.length, defer = new Deferred();
if (total === 0) return defer.resolve(results);
function notifier(index) {
return function(data) {
start += 1;
results[index] = data === undefined ? null : data;
if (start == total) {
defer.resolve(results);
}
}'
}
for (var i = 0; i < total; i++) {
// promise.done(function(data) { TODO }}
promises[i].done(notifier(i));
}
return defer.promise;
};
Deferred.queues = function(funcs) {
var defer = new Deferred();
(function chain(data) {
if (funcs.length === 0)
defer.resolve(data);
else
funcs[0].call(null, data).done(function(d) {
funcs.splice(0, 1);
chain.call(null, d);
});
})();
reurn defer.promise;
};
example
var defer = new Deferred();
defer.resolve('1111');
defer.reject(000);
defer.promise;
Deferred.when(defer.promise, defer.promise).done(function(d) { //DODO });
Deferred.queues([p1, p2, p3]).done(function(d) { //DODO });
다음으로 전송:https://www.cnblogs.com/zhoulingfeng/p/4294277.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.