9

jQueryを使わずに基本的なDeferredオブジェクトを実装したい。ここでは、resolve 関数と reject 関数を使用して、完了コールバックと失敗コールバックのみを実装します。そして ofCourse 関連付けpromiseメソッドをこの関数に関連付けます。

私は純粋なjs(編集済み)で次の実装を行っています:

function Deferred() {
    var d = {};
    d.resolve = function() {
        d.done(arguments);
    }
    d.reject = function() {
        d.fail(arguments);
    }
    d.promise = function() {
        var x = {};
        x.done = function(args) {
            return args;
        }
        x.fail = function(args) {
            return args;
        }
        return x;
    }
    return d;
}


var v;

var setVal = function() {
    var d = new Deferred();
    setTimeout(function() {
        v = 'a value';
        d.resolve(this);
    }, 5000);
    return d.promise();
};

setVal().done(function() {
    console.log('all done :' + v);
});

しかし、上記はエラーを与えます:Object #<Object> has no method 'fail'

関数の返されたオブジェクト 'd' にDeferred()メソッド done() がないことはわかっています。そして、私がこれから d.promise を返す場合、Deferred()解決および拒否機能はありません。

Deferredオブジェクトの単純な目的を達成するために私が犯しているエラーを指摘してください。

これが私がやっているフィドルです: http://jsfiddle.net/SyEmK/14/

4

3 に答える 3

21
function Deferred(){
  this._done = [];
  this._fail = [];
}
Deferred.prototype = {
  execute: function(list, args){
    var i = list.length;

    // convert arguments to an array
    // so they can be sent to the
    // callbacks via the apply method
    args = Array.prototype.slice.call(args);

    while(i--) list[i].apply(null, args);
  },
  resolve: function(){
    this.execute(this._done, arguments);
  },
  reject: function(){
    this.execute(this._fail, arguments);
  }, 
  done: function(callback){
    this._done.push(callback);
  },
  fail: function(callback){
    this._fail.push(callback);
  }  
}


var v;

var setVal = function() {
    var d = new Deferred();
    setTimeout(function() {
        v = 'a value';
        d.resolve(this);
    }, 5000);
    return d;
};

setVal().done(function() {
    console.log('all done :' + v);
});
于 2013-08-07T07:20:10.607 に答える