2013-08-07 3 views
6

jQuery를 사용하지 않고 기본 Deferred 객체를 구현하고 싶습니다. 여기서는 해결 및 거부 함수를 사용하여 완료 및 실패 콜백 만 구현합니다. andCourse는 promise 메서드를이 함수와 연결합니다.jquery를 사용하지 않고 Deferred 객체 구현

나는 순수 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'

내가없는 Deferred() 함수의 반환 된 객체 'D'를 알고를 메소드 완료(). 그리고 내가 Deferred()에서 d.promise를 반환하면 해결할 수없고 기능을 거부 할 수 없습니다.

Deferred 객체의 간단한 목적을 달성하기 위해 어떤 오류가 있는지 지적하십시오. 당신은 당신이`prototype`에 메소드를 추가해야합니다 new``으로 인스턴스를 만드는 경우 http://jsfiddle.net/SyEmK/14/

+0

: 여기

내가 뭐하는 거지 바이올린입니다. 생성자는 'return d'라고하더라도 인스턴스를 반환합니다. 'var d = Deferred()'를 원할 수도있다 – elclanrs

+0

done이라는 메소드가 없다. 당신이 당신의 사물을 바라 보면, 당신은 결심하고, 거절하고, 약속합니다. setVal()은 이러한 3 가지 메소드를 사용하여 객체의 인스턴스를 반환합니다. – THEtheChad

+0

jQuery는 약속을 구현하는 유일한 라이브러리가 아닙니다. – JayC

답변

18
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); 
}); 
+4

jQuery 동작에 더 가까워 지길 원한다면, "promise"함수를 추가하여 "done"및 "fail"만있는 객체 (호출 함수가 해석/거부에 액세스 할 수 없도록). 또한 - "this"를 완료/실패에서 반환하여 연결을 허용 할 수 있습니다. – lyosef

관련 문제