我在尝试使用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=fulfilled
和value
属性,以及像then,end,click,waitForExist等方法。但在回调中,我只接收value
属性作为参数原始客户端对象。我的问题很简单,ES2015 Promise在解决这样的对象时会执行什么样的魔法?
与这种奇怪的行为相反,调用resolve({client})
按预期工作 - then((result) => result.client.end())
答案 0 :(得分:0)
这是承诺链中的标准行为,这意味着ES2015承诺库会识别您正在使用其他承诺解析承诺并等待该承诺解决,然后继续使用该链,这就是为什么在回调中,您获取实际值,而不是您之前解决的promise对象。
然而,在第二种情况下,您将promise包含在一个对象中,该对象阻止promise库将其识别为promise,因此它只是将其传递给下一个回调。