ES2015 Promise在解决另一个问题时如何实际工作?

时间:2016-01-21 17:22:35

标签: javascript es6-promise webdriver-io

我在尝试使用ES2015 Promises时遇到了一个奇怪的问题:

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())

1 个答案:

答案 0 :(得分:0)

这是承诺链中的标准行为,这意味着ES2015承诺库会识别您正在使用其他承诺解析承诺并等待该承诺解决,然后继续使用该链,这就是为什么在回调中,您获取实际值,而不是您之前解决的promise对象。

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