gpt4 book ai didi

javascript - 如果你用另一个 promise 来解决一个 promise ,会发生什么?

转载 作者:行者123 更新时间:2023-11-27 23:25:54 25 4
gpt4 key购买 nike

ECMAScript 6.0 规范对于一个 Promise 解析另一个 Promise 有何规定?它是否应该通过将 then 附加到该 Promise 来采用另一个 Promise 的状态,从而解决这个问题?

我在 Chrome 中尝试了这个代码片段,这就是我得到的结果,它似乎只是用 Promise2 解析了 Promise1 可以吗?

> Promise1 = new Promise(function(resolve){ResolveYouLater1 = resolve})
> Promise2 = new Promise(function(resolve){ResolveYouLater2 = resolve})
> ResolveYouLater1(Promise2)
undefined
> Promise1
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: Promise}

我认为它应该将一个then附加到Promise2,当Promise2解决时,它应该ResolveYouLater1(value)

最佳答案

What does the ECMAScript 6.0 specification say about a Promise resolving another Promise?

您可以在这里自己阅读:http://www.ecma-international.org/ecma-262/6.0/#sec-promise-resolve-functions
当参数是 thenable 时, PromiseResolveThenableJob将排队。

Should it adopt the state of the other Promise by attaching a then to that Promise which would resolve this one?

是的。 .then() 方法将使用解析器和拒绝器函数进行调用。

I tried this snippet in Chrome and here is what I get and it seems to just resolve the Promise1 with Promise2 is that fine?

是的。只是resolved现在。

<小时/>

我必须承认,我当前的 Chrome 版本(48.0.2564.82、V8 4.8.271.17)并不完全符合此算法(这本身可能不是一件坏事,并且 avoids memory problems ,但可以出乎意料)。
它是惰性的,只有在实际回调对结果感兴趣时才安排作业。并且它不会将解析器传递给 then 方法,而是传递想要知道结果的实际回调。

> var resolve1, resolve2;
> var promise1 = new Promise(function(r){ resolve1 = r; });
> var promise2 = new Promise(function(r){ resolve2 = r; });
> promise2.then = function(...args) { console.log(...args);
> return Promise.prototype.then.call(this, ...args); };
> resolve1(promise2);
undefined
// you'd expected a call to the then method here
> promise1
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: Promise}
> promise2
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
> resolve2(42)
undefined
// or at least here
> promise1
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: Promise}
> promise2
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 42}
> promise1.then(x => console.log(x))
x => console.log(x), PromiseIdRejectHandler() { [native code] }
// but it only is here
42
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
> promise2.then(x => console.log(x))
x => console.log(x)
42
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
> promise1.then(x => console.log(x))
x => console.log(x), PromiseIdRejectHandler() { [native code] }
// hell they're even calling it multiple times!
42
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}

> var resolve1, resolve2;
> var promise1 = new Promise(function(r){ resolve1 = r; });
> var thenable = {then:function(r) { console.log(...arguments); resolve2 = r; }};
> resolve1(thenable);
undefined
// you'd expected a call to the then method here
> promise1
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: Object}
> thenable
Object {}
> resolve2(42)
Uncaught TypeError: resolve2 is not a function(…)
// uh. yeah.
> promise1.then(x => console.log(x))
() { [native code] }, () { [native code] }
// ah there was the call, even with a resolver
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
> resolve2(42)
42
undefined
> promise1.then(x => console.log(x))
() { [native code] }, () { [native code] }
// but now they fucked up.
// Instead of another call on the thenable, you'd expected the result to be logged
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
> resolve2(42)
42
// OMG.
undefined

关于javascript - 如果你用另一个 promise 来解决一个 promise ,会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34964819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com