const promise = new Promise(function (resolve, reject) {
// 用于兑现承诺
// resolve(100) // 承诺达成
reject(new Error('promise reject')) // 承诺失败
})
promise.then(function (value) {
console.log('resolved', value)
}, function (error) {
console.log('rejected', error)
})
console.log('end')
// 执行结果如下:
end
01-promise-sample.js:9 rejected Error: promise reject
at 01-promise-sample.js:4
at new Promise (<anonymous>)
at Object.<anonymous> (01-promise-sample.js:1)
at __webpack_require__ (bootstrap:19)
at Object.<anonymous> (bootstrap:83)
at __webpack_require__ (bootstrap:19)
at bootstrap:83
at bootstrap:83
Promise的本质也就是使用回调函数的方式去定义异步任务结束之后所需要执行的任务。嵌套使用方式是使用Promise最常见的错误,正确的做法是借助于Promise then方式链式调用的特点,尽量保证异步任务的扁平化。
Promise对象的then方法会返回一个全新的Promise对象。
后面的then方法就是在为上一个then返回的Promise注册回调。
前面then方法中回调函数的返回值会作为后面then方法回调的参数。
如果回调中返回的是Promise对象,那后面的then方法的回调会等待它的结束。
Promise静态方法:
// Promise.resolve() 把一个值转换成一个promise对象
let promise = new Promise((resolve,reject)=>{resolve('boo')})
Promise.resolve(promise) === promise // true
Promise.resolve('boo') === promise // false
Promise.resolve({
then:(onFlfilled, onejection)=>{
onFlfilled('foo')
}
}).then(value=>console.log(value)) // foo
//这样的一个对象也可以作为一个promise对象被执行,在后面的then方法也可以拿到对应的值
//带有then方法的对象可以说实现了一个叫做thenable的接口,也就是这是一个可以被then的对象,支持的原因在原生promise对象还没有普及之前,很多时候都是实用第三方库实现的promise,如果说要把第三方的promise对象转换成原生的Promise对象,就可以借助这样的机制,因为在第三方Promise对象中也有相同的then方法
//Promise.reject()
Promise.reject(new Error('rejected'))
.catch(function(error){
console.log(error)
})
// Promise.all([]) // 等待所有Promise的任务结束
// Promise.race([]) // 等待第一个Promise的任务结束