解析另一个 thenable 时,ES2015 Promise 实际上是如何工作的?

How ES2015 Promise actually works when resolving another thenable?

我 运行 在试验 ES2015 Promises 时遇到了 st运行ge 问题:

var webdriver = require('webdriverio');

(new Promise(function (resolve, reject) {
  var client = webdriver.remote({desiredCapabilities: {browserName: 'chrome'}}).init();
  client.then(function () {
    console.log(typeof client.end); // outputs "function"
    resolve(client)
  }).catch(function (e) {
    reject(e);
  });
})).then(function (client) {
  console.log(typeof client.end); // outputs "undefined"
}).catch(function (e) {
  console.log(e);
});

在上面的代码中,当我解析 client 时,发生了某种神奇的事情。在我调用 resolve 之前,客户端包含 state=fulfilledvalue 属性,以及 then、end、click、waitForExist 等方法。但是在回调中,我只收到 value 属性 原始客户端对象。我的问题很简单,ES2015 Promise 在解析这样的对象时执行了什么样的魔法?

与这种奇怪的行为相反,调用 resolve({client}) 按预期工作 - then((result) => result.client.end())

这是 promise 链中的标准行为,这意味着 ES2015 promise 库识别出您正在用另一个 promise 解决一个 promise 并等待该 promise 解决,然后继续链,这就是回调中的原因,您将获得实际值,而不是您之前使用的承诺对象。

然而,在第二种情况下,您将 promise 包装在一个对象中,这会阻止 promise 库将其识别为 promise,因此它只是将其传递给下一个回调。