Promise >>
1.Promise.resolve().reject() 是錯誤的,resolve()後面是不能接reject()
promise狀態一旦改變,就不能再變動
----------------------------------------------------------------------------------------
2.promise.catch(undefine).catch(fun_1).catch(fun_2),只有 fun_1 會被執行
Deferred >>
1.deferred.resolve(1).reject(2)可以執行,但 reject(2)是無效的,也是一旦狀態改變,就不能變動
Ex:
$.Deferred().resolve(1).reject(2).then(function(data) {
console.log('ok => ', data);
}, function(error) {
console.log('error => ', error);
});
==> 只會執行 ok
但有個狀況會嚴重所以要用 def.promise()
Ex:
function job_1() {
var def = $.Deferred();
setTimeout(() => {
def.resolve(1);
}, 200);
return def;
// 以下是正確作法
// return def.promise();
}
job_1().reject(2).then(function(data) {
console.log('ok => ', data);
}, function(error) {
console.log('error => ', error);
});
*** 若不用def.promise() 會造成 reject()先執行 ***
----------------------------------------------------------------------------------------
2. deferred 無法使用 serires
Ex:
job1().done(job2).done(job3).done(function(value) {
console.dir('finish => ', value);
});
*** 無法如 promise 達成 series效果 ***
----------------------------------------------------------------------------------------
3. $.Deferred.resolve().resolve() 與 $.Deferred.reject().reject() 效果是一樣的,都可執行下去
Ex:
$.Deferred().resolve(1).done(function(value) {
console.log('done_1 => ', value);
return 2; // 無用
}).done(function(value) {
console.log('done_2 => ', value);
});
result:
done_1 => 1
done_2 => 1