Javascript 在.then()中显式调用resolve()

Javascript 在.then()中显式调用resolve(),javascript,asynchronous,promise,Javascript,Asynchronous,Promise,如果我创建一个新的promise对象并像这样返回一个新的promise对象,p1将保持挂起状态 var p1 = new Promise((resolve, reject) => { return new Promise((resolve, reject) => { resolve(1); }); }); 但是,如果我用then()和调用revolve来链接内部的新承诺,那么外部的新承诺p1将得到解决 var p1 = new Promise((re

如果我创建一个新的promise对象并像这样返回一个新的promise对象,p1将保持挂起状态

var p1 = new Promise((resolve, reject) => {
    return new Promise((resolve, reject) => {
        resolve(1);
    });
});
但是,如果我用then()和调用revolve来链接内部的新承诺,那么外部的新承诺p1将得到解决

var p1 = new Promise((resolve, reject) => {
    return new Promise((resolve, reject) => {
        return resolve(1);
    }).then(data => resolve(123));
});

似乎
.then()
中的
resolve()。有人能告诉我这里发生了什么事吗?为什么不能解析第一个p1,为什么解析第二个p1?

承诺执行器函数(传递给
新承诺的函数)的返回值被完全忽略;这没有意义。从它那里返回承诺没有任何作用。此外,正如您所说,您正在调用内部承诺的
解析
,而不是外部承诺


第二个表单在内部承诺上使用实现处理程序来实现外部承诺。虽然您可以这样做,而且有时可能是适当的,但在通常情况下,您只需直接使用内部承诺,然后在
回调中执行其他工作。

在第一个示例中,您正在跟踪参数
resolve
。尝试:

var p1=新承诺((resolve1,reject1)=>{
决议1(新承诺)(决议2,拒绝2)=>{
决议2(1);
}));
});

第二个代码段中的promise
p1
被解析为
内部的
resolve
,然后
回调指的是外部
promise
构造函数的回调中传递的
resolve
,而不是内部
promise
构造函数的
resolve

在第一个代码段中,
resolve
总是指内部
Promise
构造函数的
resolve
,因此外部Promise永远不会得到解析

var p1 = new Promise((resolve, reject) => {
    return new Promise((resolve, reject) => {
        return resolve(1);
    }).then(data => resolve(123));
});
只需重命名回调并选中:

var p1=新承诺((外部解决,拒绝)=>{
返回新承诺((innerResolve,reject)=>{
//内部解决方案
返回innerResolve(1);
})
。然后(数据=>{
控制台日志(数据);
//外部解决方案
外部解决(123);
});
});

p1.then(console.log)
我认为外部承诺是多余的。你想用这个嵌套解决什么问题?也许有更好的办法解决这个问题。