延迟/承诺混淆和实施

时间:2014-07-27 07:27:05

标签: javascript jquery design-patterns

如果我想自己推迟实施,那么这是一种正确的方法(尝试理解内部逻辑):

延迟算是一种行为模式吗?

延期和承诺之间有什么区别?

function Deferred() {
    var d = {},
        f = {},
        a = {}, 
        state = 'pending';

    return {
        resolve: function(){
            state = 'resolved';
            a.fn.apply(a.context, arguments);
            d.fn.apply(d.context, arguments);
        },

        reject:  function(){
            state = 'rejected';
            a.fn.apply(a.context, arguments);
            f.fn.apply(f.context, arguments);
        },

        done: function(fn, context) {
            d = {fn: fn, context: context};
            return this;
        },

        fail: function(fn, context) {
            f = {fn:fn, context: context};
            return this;
        },

        always: function(fn, context) {
            a = {fn:fn, context: context};
            return this;
        },

        state: state
    }
}

应用示例:

var obj = Deferred();
    obj.done(function(arg){
        console.log('we are done here. why? -', arg);
    }, window)
     .always(function(arg){
        console.log('print that in any case. and some details:', arg);
    }, window)
     .fail(function(arg){
        console.log('we failed here. why? -', arg);
    }), window;


    obj.reject('some arguments');
    obj.resolve({argument: 'hooray!'});

1 个答案:

答案 0 :(得分:2)

如果我想自己推迟实施,这是一种正确的方法吗?

不,你的代码遗漏了几个要点:

  • 承诺/延期仅代表一个单一结果。结算(履行或拒绝)后,不得更改其状态。
  • 无论何时安装回调,都会尽快执行结果。结果已经到达时,您的代码无法执行此操作。
  • 无论安装了多少回调,它们都将被执行。您的代码只允许存储一个回调。

您可能需要查看this example implementationHow is a promise/defer library implemented?

此外,对于承诺,您需要实现可互操作的then链接方法,其行为在Promises/A+ specification中进行了描述。

  

延迟算是一种行为模式吗?

是的,你可以将它们视为观察者或访客模式的混合物。

  

延期和承诺之间有什么区别?

通常,deferred确实提供了实现或拒绝的方法,而promise是安装回调的接口(没有解析promise的能力)。有关详细信息,请参阅What are the differences between Deferred, Promise and Future in JavaScript?