如何创建自己的.then()函数?

时间:2014-09-05 21:53:44

标签: javascript jquery

我目前正在学习更多关于回调函数的知识,并希望创建自己的回调函数,并且成功和失败。

我为一个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()函数链接。

谢谢!

2 个答案:

答案 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将不会超级有用;如果你想将结果传递给回调,你需要稍微多一些的处理来将参数传递给你的回调,并可能处理失败的情况。