观察ES6模块属性
Observing ES6 Module properties
我有一个模块:
var progress = {
val: 0
};
var service = (function(){
function someMethod(){
progress.val++;
}
return{
someMethod: someMethod
};
})();
export {service,progress}
CCD_ 1将执行对数组进行迭代的操作。我想在每次迭代中将progress.val
增加一。这种进展应该是可以观察到的:
System.import('components/Service.js')
.then(function(M){
self.progress = M.progress;
Object.observe(M.progress,function(c){
console.dir(c);
});
});
不幸的是,观察者回调只被调用一次,每次迭代包含一个项目的更改数组。
如何在每次迭代中调用回调?
这就是观察对象的工作原理。
观测者只会在时钟的下一次滴答声发射一组记录。在进行单个更改时,它不会同步启动这些更改。另请参阅对象。观察同步回调。
为了实现您想要的,一种方法是重写迭代器,使其每次在循环中"休眠",从而给Object.observe
一个启动的机会。我不一定推荐这种精确的方法,但只是举个例子:
function iterate(a, fn) {
(function loop() {
if (!a.length) return;
fn(a.shift());
setTimeout(loop);
})();
}
现在,fn
对观察对象属性所做的任何更改都将在循环的迭代过程中报告。
你可以使用承诺来完成同样的事情:
function iterate(a, fn) {
a.reduce((p, e) => p.then(() => fn(e)), Promise.resolve());
}
如果你碰巧处于异步/等待环境中(这是ES7的一个功能,但在Babel等transpiler中可用),那么你也可以做以下操作,这在本质上相当于上面的promise方法:
async function iterate(a, fn) {
for (i of a) await fn(i);
}
顺便说一句,这里不需要IIFE。此外,self
没有声明——我预计self.progress = M.progress
行会出现运行时错误。
相关文章:
- YUI3模块在构建后更改属性
- 观察ES6模块属性
- 手动css模块带有属性以区分组件
- 模块中的访问属性(CommonJS 样式)
- 无法访问模块的属性或方法
- 在属性名称中搜索带有冒号的 xpath 表达式会引发异常(节点.js元素树模块)
- 将泛型函数动态关联到对象属性时的作用域.(模块模式)
- ASP.NET Javascript 揭示模块中的 RootPath 属性 @Url.Content(“~/”)
- 使用模块模式调用函数属性
- 无法读取未定义的属性“模块”
- 类型错误:无法在模块导出中设置 undefined 的属性
- 如何在脚本标记的源属性中使用 AngularJS 模块常量
- babel 5和babel 6之间发生的事情导致我导入的模块存在于对象的默认属性之外
- 使用jQuery作为没有数据主属性的模块来引导RequireJS应用程序
- RequireJS:定义模块-TypeError:无法获取未定义或null引用的属性
- 变量声明是否成为ecmascript 6模块中窗口的属性
- 从javascript模块属性中获取未定义
- RequireJS——调用模块内部的另一个属性
- 向节点模块中的顶级对象添加属性
- 如何在JavaScript中设置函数本身的一些属性(模块模式)