定义
- 最终会编程可用值的代理
- 是一种处理异步代码(而不会陷入回调地狱)的方式
运作方式
当promise被调用后,它会以处理中状态开始,这意味着调用的函数会继续执行,但是promise仍处于处理中直到解决为止,从而为调用函数提供所请求的任何数据。
被创建的promise最终会以被解决状态(reslove) 或者被拒绝状态(reject) 结束,并在完成时调用相应的回调函数(传给then或者catch)
代码实现
let done = true;
const isItDoneYet = new Promise((reslove, reject) => {
if (done) {
consot createParams = '被创建的信息项';
reslove(createParams);
} else {
reject('访问被拒绝了');
}
}).then(data => {
/* */
}).catch(err => {
/* 捕捉错误 */
})
编排promise_执行多个
Promise.all()
同步所有的Promise,当所有的执行完成之后在一并进行回调
let f1 = new Promise((relove) => {
setTimeout(() => {
relove(1)
}, 3000)
})
let f2 = new Promise((relove) => {
setTimeout(() => {
relove(2)
}, 7000)
})
Promise.all([f1, f2]).then(([res1, res2]) => {
console.log(res1, res2) // 1 2
}).catch()
Promise.race()
当传递给的首个Promise被解决之后,Promise.race()开始运行,并且只运行一次附加的回调(传入第一个被解决的promise的结果
let f1 = new Promise((reslove) => {
setTimeout(reslove, 5000, '第一个参数')
})
let f2 = new Promise((reslove) => {
setTimeout(reslove, 3000, '第二个参数')
})
Promise.race([f1, f2]).then((result) => {
console.log(result) // 第二个参数
})
常见问题整理
如果在控制台中收到 Uncaught TypeError: undefined is not a promise 错误,则请确保使用 new Promise() 而不是 Promise()。
这意味着调用的 promise 被拒绝,但是没有用于处理错误的 catch。 在 then 之后添加 catch 则可以正确地处理。