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

How to create my own .then() function?

本文关键字:自己的 then 函数 创建 何创建      更新时间:2023-09-26

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

我为一个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不会非常有用;如果您想将结果传递给回调,则需要稍微复杂一些的处理来将参数传递给回调并可能处理失败案例。