如何创建自己的.then()函数
How to create my own .then() function?
我目前正在学习更多关于回调函数的知识,并希望创建自己的成功和失败的回调函数。
我为一个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()
函数链接。
谢谢!
您只需要在函数中返回this
Person.rockPaperSissor = function(player1, player2) {
this.state = player1.randomRps() === player2.randomRps();
return this;
};
Person.then = function() {
var x = this.state;
};
假设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;
};
在您的特定情况下,除非您在Person
上将rockPaperSissor
函数的结果公开为持久状态,否则.then
不会非常有用;如果您想将结果传递给回调,则需要稍微复杂一些的处理来将参数传递给回调并可能处理失败案例。
相关文章:
- 按我自己的类克隆另一个元素的内容和顺序
- 如何配置分析以将数据发送到我自己的服务器
- 如何使用jquery ajax和jsonp在您自己的域上读取json数据
- 创造自己的智能
- 如何在Win8Metro应用程序的Javascript代码中捕获自己的C#事件
- 从自己的安全系统中重新找回自己
- 麻烦将coffee脚本片段移动到rails中自己的类中
- 从我自己的脚本中包含的Javascript文件中调用一个函数
- 让我自己的过滤器不工作
- 消隐数组元素是否生成自己的属性
- JavaScript子对象访问自己的值
- Selenium异步脚本在自己的线程中阻塞其他脚本
- 为什么对象的函数值没有自己的作用域
- 我怎样才能给数组中的每个对象赋予它们自己的键
- 制作我自己的加密/解密系统
- 我如何才能使数组中的按钮只对其作出响应'使用javascript的自己的包装器
- NodeJS:一个全局EventEmitter或每个模块它'他自己的
- 如何将我自己的按钮连接到下载库
- PHP脚本在Lion上通过Ajax运行时会回显自己的内容
- 如何创建自己的.then()函数