如何在对象构造期间使用异步生成的值分配属性
How can a property be assigned during object construction with a value generated asynchronously?
如何在对象构造期间使用异步生成的值分配属性?
我正在尝试在构造过程中为需要通过 AJAX 检索的对象分配一个属性:
//define module prototype
Library.Module = function () {
this.resources = {};
for (var i = 0; i < arguments.length; i++) {
// assume that Library.require makes a request and
// then executes this callback
Library.require(arguments[i], function (resource) {
// ! the problem seems to be that 'this' is undefined
// in the scope of the callback
this.resources[resource.location] = resource;
});
}
};
我认为这段代码的意图相当明确 - 问题是this
似乎在回调函数的范围内未定义。
如以下文章 https://blog.engineyard.com/2015/mastering-this-in-javascript 和评论中的讨论所示,一种可能的解决方案是将其存储在范围更高的变量中,以便在回调中使用它。
因此,可能的解决方案可能是:
Library.Module = function () {
var _this = this;
_this.resources = {};
for (var i = 0; i < arguments.length; i++) {
// assume that Library.require makes a request and
// then executes this callback
Library.require(arguments[i], function (resource) {
_this.resources[resource.location] = resource;
});
}
};
引用文章中的有用片段:
在回调中管理它
就是这样:这是设置函数此值的四种方法。 这四条规则并不难记住,但有一个共同点 你应该知道的陷阱。我说的是回调。这很容易 编写回调甚至不知道它,就像在 setTimeout 中一样:
setTimeout(function() { $(‘button’).addClass(‘red’); }, 1000);
setTimeout 函数接受回调,但由于它没有使用 设置上下文的四个规则之一,默认为全局 窗口对象。在上面的例子中这很好,但变成了一个错误 像这样的代码:
$('button').on('click', function() { setTimeout(function() { // Uh oh! `this` is the global object! $(this).addClass('clicked'); }, 1000); });
我们希望 $(this) 引用单击的按钮,但是 它不会,因为这默认为全局窗口对象。单程 解决这个问题是将我们期望的值存储在本地 变量,然后在子作用域中简单地使用该变量:
$('button').on('click', function() { var _this = this; setTimeout(function() { $(_this).addClass('clicked'); // All better }, 1000); });
当然,有很多方法可以完成同样的事情。你可以 使用 .bind()、.call() 或许多其他选项。选择有效的方法 最适合每种情况。
相关文章:
- 在异步函数调用过程中,当对象的属性值发生变化时,JavaScript中的对象属性值会发生什么变化
- 异步编程-如何在对象数组中循环,并使用从api获取的数据更改每个对象的属性
- javascript<脚本异步属性>
- Javascript-在检查对象属性是否存在时避免异步竞争条件
- 使用脚本异步属性的含义是什么
- 异步脚本属性与异步属性
- 具有异步设置属性的 JS 对象
- 如何在对象构造期间使用异步生成的值分配属性
- 加载类异步的单个属性
- 余烬在加载时观察到异步属于关系属性
- 流星模板异步呈现 - 无法读取 null 的属性“偏移宽度”
- Ember异步计算属性返回未定义的
- 异步关系上的Ember数据计算属性
- 动态异步加载CSS(通过在Javascript中设置“href”属性)
- 角度指令-异步属性插值
- 在角控制器中,如何在初始化另一个属性之前先初始化多个异步属性
- 在AngularJS中,如何为多个控制器的共享服务属性的异步模型更改更新绑定[.]
- 填充某些属性的Javascript异步调用
- 当我需要阻塞调用时,如何处理Ember中的异步属性
- HTML5脚本元素 - 异步属性 - 何时(以及如何最好)使用