我正在尝试了解 JavaScript Promises ,到目前为止,我遇到了很多代码,其中一个裸体(缺少更好的单词)Promise被返回,即一个没有任何调用到.then()
,以及附加.then()
的代码。
两者之间有什么区别?你何时使用另一个?
myfn1() {
return new Promise((resolve, reject) => {
//...resolve or reject
}
}
.then()
的承诺myfn2() {
return new Promise((resolve, reject) => {
//...resolve or reject
}
.then((res) => {
//...do something upon resolve
})
}
答案 0 :(得分:3)
当您使用then
时,您需要确定您希望处理承诺解决的数据(或错误)的位置。如果你立即用then
链接它,那么我想你可以立即解决它。
但是你可能想要获得承诺本身,并在其他地方处理结果。也许您有一个服务文件,其唯一目的是创建HTTP请求,但您希望处理不同范围内的数据 - 调用函数的范围:
// service.js
callServer() {
return new Promise(...)
}
// file.js
callServer().then( /* there's a different scope here */ )
也许你甚至想得到几个承诺,然后使用Promise.all(promisesArray)
,只有在所有承诺都得到解决后才会采取行动:
const movies = getMovies(); // promise
const actors = getActors(); // promise
const directors = getDirectors(); // promise
Promise([movies, actors, directors]).then(_ => /* handle data */ );
取决于应用程序,可能有很多原因。
答案 1 :(得分:2)
主要区别在于您可以使用从前一个promise链定义的操作结果(通常是异步)。请考虑以下代码:
new Promise((resolve, reject) => {
// we simulate an async op using setTimeout that returns an object
setTimeout(() => resolve({ status: 'ok' }), 2300);
// the value of res is defined as the value that is resolved from the previous promise chain, so in this case the object { status: 'ok'}
}).then(res => {
// do something with resolved result
console.log(res)
})
如果没有then
方法,您将无法获得前一个保证链中定义的返回值的值。
答案 2 :(得分:1)
两者之间的低级别和基本差异在于返回了不同的承诺。
return new Promise((resolve, reject) => {
//...resolve or reject
}
返回调用new Promise
创建的承诺。
return new Promise((resolve, reject) => {
//...resolve or reject
}
.then((res) => {
//...do something upon ** fulfillment **
})
返回调用新Promise的then
方法返回的promise。
如果调用then
的承诺(由上面的new Promise
创建)将被拒绝,then
使用单个参数返回的承诺将被拒绝,原因相同:a {永远不会调用onFulfilled反序处理程序提供的{1}}。
如果满足第一个承诺,则调用作为第一个参数提供给then
的回调,并根据回调的行为确定then
返回的承诺:
如果回调返回的值不是承诺,则then
返回的承诺将使用相同的值来履行,或
如果回调引发错误,then
返回的承诺将被抛出错误的值,
如果回调返回一个承诺(本机承诺或来自库代码的承诺),则从then
返回的承诺与其相关联,并最终采用相同的已结算状态并满足价值或拒绝原因作为回调返回的承诺。
决定从函数返回由then
创建的承诺,或者由承诺链中的最后一个new Promise
或then
子句返回的承诺,取决于函数的设计,而不是Promise对象的设计。