javascript - 异步 JavaScript 和对象持久化

标签 javascript oop asynchronous coding-style

我的 JS 代码大致是这样的:

function myObject()
{
    this.a = 13;

    this.fetchData = function()
    {
        alert(this.a);
        getData(this.processData);
    }

    this.processData = function(data)
    {
        // do stuff with data
        alert(this.a);
    }

    this.fetchData();
}

function getData(callback)
{
    // do async request for data and call callback with the result
}

我的问题是:函数 fetchData 可以通过 this 关键字访问我的 a 变量,但是另一个函数 processData 在被 getData 调用时不会。我明白为什么会发生这种情况,但不知道如何解决。

您如何最好地以 OOP 风格解决这个问题? (函数 getData 必须可用于多个类)

最佳答案

两种选择:

1) 让 getData 接受上下文参数(通常称为 contextthisArg)并使用 callback.apply(context, ...)callback.call(context, ...) 来调用它。所以:

function getData(callback, context) {
    // ...when it's time to call it:
    callback.call(context, arg1, arg2);
    // or
    callback.apply(context, [arg1, arg2]);
}

2) 创建一个函数,该函数在被调用时将返回并调用原始回调,并将 this 设置为正确的值。 (这有时称为“绑定(bind)”。)

例如,使用显式闭包:

this.fetchData = function()
{
    var self = this;

    alert(this.a);
    getData(getDataCallback);

    function getDataCallback(arg1, arg2) {
        self.processData(arg1, arg2);
    }
}

或者有一个通用的 bind 函数来完成它(这也将涉及一个闭包,但在一个很好的受控上下文中,所以它不会关闭你不需要的东西)。有关简单 bind 函数的示例,请参见下面的链接。

更多:You must remember this

关于javascript - 异步 JavaScript 和对象持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4991019/

相关文章:

javascript - 有谁知道如何将鼠标重新单击延迟指定的时间吗?

javascript - MongooseError : Query was already executed: Todo. updateOne({ _id: new ObjectId("612df063a8f

.net - ASP.NET——如何在不过度设计的情况下有效地使用设计模式!

python - python中包的全局变量可以被认为是邪恶的吗?

java - Android非阻塞文件I/O?

asynchronous - Vue JS AJAX 计算属性

javascript - 将 JSON 字符串传递给 Perl CGI

javascript - 如何在不迭代数组的情况下从 $scope 中删除对象?

php - 如何在 PHP 中使用其原始参数调用父类构造函数

c++ - 如何使函数异步信号安全?