then: function (callback, errback) {
var result = defer();
var wrappedCallback = function(value) {
try {
result.resolve((callback || defaultCallback)(value));
} catch(e) {
exceptionHandler(e);
result.reject(e);
}
};
var wrappedErrback = function(reason) {
try {
result.resolve((errback || defaultErrback)(reason));
} catch(e) {
exceptionHandler(e);
result.reject(e);
}
};
if (pending) {
pending.push([wrappedCallback, wrappedErrback]);
} else {
value.then(wrappedCallback, wrappedErrback);
}
return result.promise;
}
always: function (callback) {
function makePromise(value, resolved) {
var result = defer();
if (resolved) {
result.resolve(value);
} else {
result.reject(value);
}
return result.promise;
}
function handleCallback(value, isResolved) {
var callbackOutput = null;
try {
callbackOutput = (callback ||defaultCallback)();
} catch(e) {
return makePromise(e, false);
}
if (callbackOutput && callbackOutput.then) {
return callbackOutput.then(function() {
return makePromise(value, isResolved);
}, function(error) {
return makePromise(error, false);
});
} else {
return makePromise(value, isResolved);
}
}
return this.then(function(value) {
return handleCallback(value, true);
}, function(error) {
return handleCallback(error, false);
});
}
有兩個(gè)部分,then 和 always,兩個(gè)都是可執(zhí)行的方法。
always 這里不作討論。來看看then ,它有兩個(gè)參數(shù),callback 和 errback, 第一個(gè)用來處理“resolved”和“success”事件;第二個(gè)用來處理“rejected”和“failure”事件。
所以,delay.promise不是現(xiàn)成的數(shù)據(jù),還不能直接使用。然后來看看這個(gè)then怎么使用(主要是如何從中提取出我們需要的后臺(tái)返回的數(shù)據(jù)):