你如何(最好)访问这个'在作为回调传递的对象方法中

时间:2018-06-09 16:11:15

标签: javascript node.js callback this

我正在编写一个简单的文字游戏来练习我的javascript(我是新手),使用NPM包prompthttps://www.npmjs.com/package/prompt)在我需要时查询用户一个回应。

由于我来自OOP背景(在其他语言中),我一直在尝试在不同对象中封装不同的功能。所以我在一个对象中有所有prompt相关代码,比如这个

function Prompter() {

    this.getUserName = function (callback) {

        var schema = {
            properties: {
                name: {
                    description: "Tu nombre por favor:",
                    pattern: /^[ñÑa-zA-Z\s\-]+$/,
                    message: 'Solo letras, por favor',
                    required: true
                }
            }
        };
        prompt.get(schema, callback);
    };
}

和像这样的另一个对象中的游戏逻辑(这是代码的相关部分)

function Game() {

    this.qGenerator = null;
    this.prompter = null;
    this.user = "";

    this.doNextRound = function () {
       //// omitted for brevity
    };

    this.init = function () {
        this.qGenerator = new QuestionGenerator();
        this.prompter = new Prompter();
    };

    this.startGame = function () {
        this.prompter.getUserName(this.storeUserName);
    };

    this.storeUserName = function (err, result) {
        if (err) {
            this.handleErr(err);
            return;
        }
        this.user = result.name;
        this.doNextRound();
    };
}

我就像这样开始游戏

const game = new Game();
game.init();
game.startGame();

我遇到的问题是Game方法storeUserName,我已将其作为prompt的回调传递,我无法访问Game }通过this对象,因此,当我调用

this.doNextRound

storeUserName里面我得到了

TypeError: this.doNextRound is not a function

我理解为什么,因为this引用了回调中的Node。但我不知道如何在我作为回调传递的方法中保留对正确this的引用。我了解如何在更多'香草' Javascript - 使用that = thisapply等,但我不确定在Node回调中处理this的最佳方式是当你传递另一个时对象的方法。任何建议都非常感激。

1 个答案:

答案 0 :(得分:1)

使用Function.prototype.bind

this.prompter.getUserName(this.storeUserName.bind(this));

arrow function

this.prompter.getUserName( _ => this.storeUserName() );

其中任何一个都可以。