Promise 的一些注意点,以及梳理
昨天面试去 xiaoman, 提到了 promise; 面对不断深入发问, 我脑子一片空白, 然后就想到了白云山; 我想怎么思考其他问题的时候没有这么思维活跃;
Promise.prototype.then()
Promise.prototype.catch()
Promise.prototype.finally()
Promise.all() // 必须所有都 resolved
Promise.race() // 只要有一个 resolved
Promise.allSettled() // 所有都结束,不管是 resolved 还是 rejected
Promise.any() // 只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。 与 race 只有一点不同,就是Promise.any()不会因为某个 Promise 变成rejected状态而结束,必须等到所有参数 Promise 变成rejected状态才会结束。
Promise.resolve()
Promise.reject()
Promise.try()
Promise 状态的一旦变成 resolved 或 rejected 时,Promise 的状态和值就固定下来了,不论你后续再怎么调用 resolve 或 reject 方法,都不能改变它的状态和值。
var p1 = new Promise(function (resolve, reject) {
resolve('success1')
resolve('success2')
})
var p2 = new Promise(function (resolve, reject) {
resolve('success')
reject('reject')
})
p1.then(function (value) {
console.log(value)
})
p2.then(function (value) {
console.log(value)
})
// "success1"
// "success"
当然会
catch
相当于then(null,function(err){ /*处理错误*/})
的写法
// 写法一
new Promise((resolve) => {
foo.bar()
}).then(
(res) => {
console.log(res)
},
(err) => {
console.log(err)
}
)
// ReferenceError: foo is not defined
// 写法二
new Promise((resolve) => {
foo.bar()
})
.then((res) => {
console.log(res)
kk()
})
.catch((err) => {
console.log(err)
})
// ReferenceError: foo is not defined