对象解构在 Promise 中解决和拒绝

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)

我有一种奇怪的感觉,好像我错过了一些非常基本的东西,但我不知道是什么。

con*_*exo 5

您展示的任何代码都没有解构。

您正在重新分配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 语法则不会。

  • @Redu 并不是很奇怪。这只是一条线上的大量操作。您需要从右到左阅读它们,因为这是解决的顺序。[基本上是这样](https://jsbin.com/mifobaxiwa/1/edit?js,console),但写得更混乱。 (2认同)