我目前正在学习更多关于回调函数的知识,并希望创建自己的回调函数,并且成功和失败。
我为一个Person
对象写了一个摇滚纸剪刀游戏
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 :(得分:5)
您只需要在功能
中返回此Person.rockPaperSissor = function(player1, player2) {
this.state = player1.randomRps() === player2.randomRps();
return this;
};
Person.then = function() {
var x = this.state;
};
答案 1 :(得分:3)
假设Person.rockPaperSissor
中的某些内容是异步,您需要返回某种Promise对象。正如其他人所指出的那样,如果这里的结果是同步的,那么这个特定误导就没有意义了。 JQuery在DeferredObject中提供了一个实现;如果你想自己编写,你需要弄清楚这个对象应该支持哪些方法。
举一个相对简单的案例,你可以制作一个只支持.then
的Promise类:
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
将不会超级有用;如果你想将结果传递给回调,你需要稍微多一些的处理来将参数传递给你的回调,并可能处理失败的情况。