除了我已经在问题中描述的解决方法之外,似乎没有其他解决方案。供将来参考,如果您想实现(而不是解决)
p带有value
的诺言
val,其中
val另一个诺言,那么仅
p通过参数调用诺言解析函数
val将无法正常工作。它将导致
p“锁定”在的状态
val,以便一旦满足,
p将使用
val的分辨率值
val来满足(请参见spec)。
相反,请包装
val另一个对象并
p对该对象进行解析:
var resolveP; // Promise resolution function for pvar p = new Promise( function(resolve, reject) { resolveP = resolve; });function fulfillPwithPromise(val) { // Fulfills p with a promise val resolveP({promise: val});}p.then(function(res) { // Do something as soon as p is fulfilled... return res.promise;}).then(function(res) { // Do something as soon as the second promise is fulfilled...});如果您已经知道这
val是一个承诺,那么此解决方案就可以使用。如果您不能对
val的类型做任何假设,那么您似乎很不走运。您必须 始终
将承诺解决方案值包装在另一个对象中,或者可以尝试检测是否
val具有
then类型为“功能” 的字段并有条件地包装它。
也就是说,在某些情况下,承诺解决方案的默认行为实际上可能会产生预期的效果。因此,仅在您确定要 实现 而不是用第二个承诺 解决
第一个承诺时,才使用上述解决方法。



