Red*_*edu 2 javascript destructuring promise
对象解构不是我最喜欢的东西,我经常尽量避免使用它。但是,在这种特殊情况下,我很好奇而无法忽视正在发生的事情。
现在我们可以这样做;
var o = {},
x = 1,
y = 2;
o = {x,y};
console.log(o); // <- {x: 1, y: 2}
Run Code Online (Sandbox Code Playgroud)
一切都很好;
不过,我的情况有点复杂;
var p = function(o){
o.promise = new Promise((resolve,reject) => o = {resolve,reject});
console.log(o) // -< {resolve: ƒ, reject: ƒ}
return o;
}({});
console.log(p); // -< {resolve: ƒ, reject: ƒ}
Run Code Online (Sandbox Code Playgroud)
..的promise财产在p哪里?所以我用经典的方式来做;
var q = function(o){
o.promise = new Promise((resolve,reject) => ( o.resolve = resolve
, o.reject = reject
));
console.log(o) // <- {promise: Promise, resolve: ƒ, reject: ƒ}
return o;
}({});
console.log(q); // <- {promise: Promise, resolve: ƒ, reject: ƒ}
Run Code Online (Sandbox Code Playgroud)
我有一种奇怪的感觉,好像我错过了一些非常基本的东西,但我不知道是什么。
您展示的任何代码都没有解构。
您正在重新分配o给一个具有 2 个属性的简单普通新对象:
o = {resolve,reject}
Run Code Online (Sandbox Code Playgroud)
这只是ES2015 引入的对象字面量速记语法,与
o = {resolve: resolve, reject: reject}
Run Code Online (Sandbox Code Playgroud)
当然,之前的promise属性会丢失,因为它存在于一个不再被引用的对象上o(如果内存中没有其他引用,最终将被垃圾收集)。
尝试
o.promise = new Promise((resolve,reject) => o = { ...o, resolve, reject });
不,这...o也不是解构,它是对象传播语法。
你也可以使用
o.promise = new Promise((resolve,reject) => o = Object.assign(o, { resolve, reject }));
Run Code Online (Sandbox Code Playgroud)
请注意,Object.assign()触发 setter(如果有),而 spread 语法则不会。
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |