【问题标题】:Callback within a promise within a class?类内的承诺内的回调?
【发布时间】:2016-07-08 23:55:00
【问题描述】:

我有一个类,我用它通过 XMLHttpRequest(这是用于 WebGL)加载外部资源,所以我正在加载模型、着色器等。我的计划是在它完成所有这些请求时放置一个加载显示,然后当它最终完成时,我希望它从创建它的原始函数运行一个回调函数。但是,当我尝试运行该回调时,我得到了奇怪的结果(例如它无法访问执行加载的类中的任何对象)。

我可以通过将“this”传递给加载类然后执行来解决这个问题

self = this; 
promise(self.callback());

但我更愿意指定我希望它在完成加载后回调的函数。有谁知道这是否可以做到?我的代码如下所示:

主类

this.loadingClass = new LoadingClass(this.LoadingComplete, resources);

Main.prototype.LoadingComplete = function()
{
    // Returns undefined if i specify the callback function instead of just "this"
    console.log(this.loadingClass.anyOfTheMembersOfThisClass);
}

加载类

LoadingClass = function(callback, resources) {

  ..

        Promise.all(resources).then(function(loadedResources)
        {
            ..
            callback();

        });
}

【问题讨论】:

    标签: javascript callback promise


    【解决方案1】:

    当你将函数对象传递为

    (this.LoadingComplete, resources)
    

    它所绑定的对象将不会被传递。所以,只有函数对象LoadingComplete 被传递给LoadingClass 并且当它被调用时

    callback()
    

    this 的值将是 undefined(在严格模式下)。

    为了解决这个问题,

    • 你需要绑定this对象,像这样

      new LoadingClass(this.LoadingComplete.bind(this), resources)
      
    • 如果您的环境支持 ES2015 的箭头函数

      new LoadingClass(() => this.LoadingComplete(), resources);
      

    在这两种情况下,当从LoadingClass 调用LoadingComplete 时,this 将被保留。

    【讨论】:

      【解决方案2】:

      您正在从根对象中删除回调(了解"this")函数,因此它当然会丢失上下文。使用Function.prototype.bind 方法显式指定bindingContext:

      this.loadingClass = new LoadingClass(this.LoadingComplete.bind(this), resources);
      

      【讨论】:

        猜你喜欢
        • 2017-01-07
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        • 2020-03-24
        • 2016-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多