2017年2月28日 星期二

(js)Promise 與 deferref 的差異

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