Javascript 将另一个承诺传递给承诺处理程序

Javascript 将另一个承诺传递给承诺处理程序,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我希望承诺处理程序记录承诺p1(而不是值“A”),因为console.log是通过p1直接调用的。然而,它不知怎么地记录了“A”。promisep1如何自动解析为“A”,而不被调用?例如,console.log(p1)不会像预期的那样直接输出“A”。幕后有什么事吗 var p1=新承诺(函数(解析、拒绝){ 决议(“A”); }); var p2=新承诺(功能(解决、拒绝){ 决心(p1); }); p2.然后(函数(v){ 控制台日志(v) });将一个承诺解析为另一个承诺将自动使其等待另一

我希望承诺处理程序记录承诺
p1
(而不是值“A”),因为
console.log
是通过
p1
直接调用的。然而,它不知怎么地记录了“A”。promise
p1
如何自动解析为“A”,而不被调用?例如,
console.log(p1)
不会像预期的那样直接输出“A”。幕后有什么事吗

var p1=新承诺(函数(解析、拒绝){
决议(“A”);
});
var p2=新承诺(功能(解决、拒绝){
决心(p1);
});
p2.然后(函数(v){
控制台日志(v)

});将一个承诺解析为另一个承诺将自动使其等待另一个承诺的结果

这就是承诺可链接的原因(在
then()
回调中返回更多承诺)。

来自:

承诺、决心(价值)

返回使用给定值解析的承诺对象。如果 值是一个thenable(即有一个then方法),即返回的承诺 将“跟随”该表,采用其最终状态;否则 返回的承诺将以该值实现。一般来说,如果 你不知道某个值是否是承诺,承诺。解决(值) 相反,它使用返回值作为承诺


p1
是可启用的,因此返回承诺将遵循它。

@Xufox抱歉没有正确阅读这是正确的。是的,
然后
在幕后被调用:
resolve(p1)
变成
p1。然后(resolve,reject)
@Bergi我相信你的评论就是我想要的答案。更多解释解析(p1)是如何变成p1的。然后在答案中给出解析(p1),拒绝(p1)将非常有帮助!如果你想通过一个允诺对象来移动一个允诺对象,通过<代码>解析> /代码>函数到<代码>。()(代码)>阶段,你可以考虑适当地打包它(如果需要的话还有其他一些东西),然后像下面的代码一样进一步访问它。然后(V= >控制台。log(V(0)))< /代码>。请注意,您最初的期望是合理的,因为
resolve
的语义是“获取一个值并将其解析为
承诺”。当然,这个值可以是另一个
Promise
,期望得到嵌套的
Promise
是合理的。然而,为了短期的便利,语言设计者决定放弃这两个承诺。但是,应为
保留两个承诺,然后
承诺。在OPs代码中不调用resolve
,though@BergiOP本质上就像
Promise.resolve(Promise.resolve(“A”))。然后(v=>console.log(v))
对于
新承诺((v,x)=>v(新承诺((v,x)=>v(“A”)))来说,这将是非常尴尬的。然后(v=>console.log(v))
与这个解释相冲突。@Redu Yes,“本质上”。但是OP可能不知道这一点,而且答案中也没有明确说明。您是说在then函数处理程序中返回承诺吗?我知道这一点,但很明显,Promise.prototype.then call没有回复承诺。谢谢。@kuan-Yes,那就是:
then
返回的承诺用
then
回调的返回值解析。在内部,它基本上使用了
newpromise
resolve
回调函数,就像您在示例中所做的那样,当然
newpromise
很少直接用于此函数。@SLaks是的,这是OP想要知道的。但最好能提供一些参考。不,没有你所描述的行为,承诺是完全可以链接的。@kuan:关键是一个承诺永远不会变成另一个承诺。它将始终解析为该承诺的(最终)值。“问题是,一个承诺永远不会解析为另一个承诺。它将始终解析为该承诺的(最终)值。”jQuery
$.Deferred()
实现
承诺
是否与
承诺
规范相反?看见