var firstPromise = new Promise((resolve, reject) => {
resolve('first promise');
});
firstPromise.then(() => {
return new Promise((resolve, reject) => {
resolve('second promise');
}).then((result) => {
console.log('hello');
});
}).then((result) => {
console.log(result);
});
控制台日志输出
'hello'
undefined
我知道这不是编写此承诺链的最佳方式,但我想知道为什么最后.then
执行。我没有用console.log('hello')
返回任何内容,所以第二个承诺的关闭不会解决吗?
答案 0 :(得分:5)
因为您已将多个承诺链接在一起,并且您的.then()
处理程序之一没有返回任何内容。
这部分:
.then((result) => {
console.log('hello');
// since there is no return value here, the promise chain's resolved
// value becomes undefined
值 });
返回与return undefined
基本相同的任何内容,因此链的解析值变为undefined
。
您可以将其更改为此值以保留已解析的值:
.then((result) => {
console.log('hello');
return result; // preserve resolved value of the promise chain
});
请记住,每个.then()
处理程序的返回值将成为未来链的已解析值。没有返回值会使解析后的值为undefined
。
答案 1 :(得分:0)
你的最后一个.then正在接收你的嵌套Promise中创建的结果,并且,因为你没有返回任何东西(即你只是在做console.log('hello')),所以结果是未定义的。如果您实际返回了某些内容,则可以看到此行为:
routes.MapRoute(
name: "Partner",
url: "Partner/{id}",
defaults: { controller = "Home", action = "Partner" }
);
这会输出:
var firstPromise = new Promise((resolve, reject) => {
resolve("first promise");
});
firstPromise
.then(() => {
return new Promise((resolve, reject) => {
resolve("second promise");
}).then(result => {
console.log("hello");
return "something";
});
})
.then(result => {
console.log(result);
});
}
答案 2 :(得分:0)
您可以在答应解决后呼叫任意数量的then
。
您的情况: // 1 已解决的承诺已分配给 // 2 结果
// 4 没有退货可以使用。因此,结果是不确定的。
var firstPromise = new Promise((resolve, reject) => {
resolve('first promise');
});
firstPromise.then(() => {
return new Promise((resolve, reject) => {
resolve('second promise');//1
}).then((result) => {
console.log(result);//2
console.log('hello');//3
});
}).then((result) => {
console.log(result);//4
}).then((result) => {
console.log(result);
}).then((result) => {
console.log(result);
}).then((result) => {
console.log(result);
})
如果您在 // 3 结果被确认后返回了某物。
var firstPromise = new Promise((resolve, reject) => {
resolve('first promise');
});
firstPromise.then(() => {
return new Promise((resolve, reject) => {
resolve('second promise');//1
}).then((result) => {
console.log(result);//2
console.log('hello');//3
return("test")
});
}).then((result) => {
console.log(result);//4
}).then((result) => {
console.log(result);
}).then((result) => {
console.log(result);
}).then((result) => {
console.log(result);
})