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