2014-09-05 25 views
1

我目前正在學習更多關於回調函數的知識,並希望通過成功和失敗來創建自己的回調函數。如何創建我自己的.then()函數?

我已經寫了Person對象石頭紙sissors的遊戲

Person = (function() { 
    function Person(name) { 
    this.name = name; 
    } 

    Person.prototype.randomRps = function() { 
    var choices, randomChoice; 
    choices = ["rock", "paper", "sissor"]; 
    return randomChoice = choices[Math.floor(Math.random() * choices.length)]; 
    }; 

    Person.rockPaperSissor = function(player1, player2) { 
    return player1.randomRps() === player2.randomRps(); 
    }; 

    return Person; 

})(); 

我想打電話給Person.rockPaperSissor(p1,p2).then(...)但不知道我應該怎麼寫這個.then()功能鏈它的.rockPaperSissor()

類似於jQuery的$.get().success()error()的功能鏈。

謝謝!

+0

你想要的是一個Promise實現。如果您願意使用在所有瀏覽器中都不可用的功能,則可以使用某些現代瀏覽器上提供的原生Promise實現。 – 2014-09-05 21:54:36

+6

你沒有任何異步;沒有理由這樣做。 – SLaks 2014-09-05 21:54:49

+1

看看這個:http://schier.co/post/method-chaining-in-javascript – jfrej 2014-09-05 21:56:43

回答

4

你只需要在你的功能

Person.rockPaperSissor = function(player1, player2) { 
    this.state = player1.randomRps() === player2.randomRps(); 
    return this; 
}; 

Person.then = function() { 
    var x = this.state; 
}; 
+0

太棒了!這很好用!如果我不想做一個'then',而是想要做一個「相同的......」或「不同的(...)'?我會只是做一個'if'語句來檢查? – 2014-09-05 22:08:46

+0

不幸的是,這超出了我的知識範圍,我很抱歉。但我看到@nrabinowitz對promisses作了更全面的解釋 – patricK 2014-09-05 22:33:22

3

假設東西Person.rockPaperSissor是異步返回這個,你需要返回某種承諾的對象。正如其他人所指出的那樣,如果這裏的結果是同步的,那麼這種特定的誤導就沒有意義。 JQuery在DeferredObject中提供了一個實現;如果你想寫你自己的,你需要弄清楚這個對象應該支持哪些方法。

舉一個比較簡單的情況下,可以作出承諾類,僅支持.then這樣的:

function Promise() { 
    // start unresolved 
    this.resolved = false; 
    // init list of callbacks to fire on resolution 
    this.callbacks = []; 
} 

Promise.prototype = { 
    then: function(callback) { 
     if (this.resolved) { 
      // if resolved, fire immediately 
      callback(); 
     } else { 
      // otherwise, queue up the callback for later 
      this.callbacks.push(callback); 
     } 
    }, 

    resolve: function() { 
     this.resolved = true; 
     // fire all callbacks 
     this.callbacks.forEach(function(callback) { 
      callback(); 
     }); 
    } 
}; 

然後,在你的異步功能,你會做這樣的事情:

Person.rockPaperSissor = function(player1, player2) { 
    var promise = new Promise(); 

    doSomethingAsync(function callback() { 
     promise.resolve(); 
    }); 

    return promise; 
}; 

在您的具體情況下,.then將不會超級有用,除非您將rockPaperSissor函數的結果公開爲Person上的持久狀態;如果要將結果傳遞給回調函數,則需要稍微多處理一些參數,以便將回參傳遞給回調函數,並可能處理失敗情況。

+0

感謝那@nrabinowitz我不知道承諾是如何工作的,但這是對它的一個很好的解釋。 – 2014-09-05 22:29:02

+0

謝謝你的解釋@nrabinowitz,我不知道promisses是如何工作的 – patricK 2014-09-05 22:34:31

相關問題