Promise是一种异步编程解决方案,es6中原生提供了Promise对象
有三种状态:pending
、resolved
、rejected
。状态一旦改变,就不会再变。
基本用法
var p = new Promise(function(resolve, reject){
resolve('成功')
// or
reject('失败')
})
p.then(function(result) {
console.log(result) // 成功
}).catch(function(error){
console.log(error) // 失败
})
Promise.prototype.then()
链式调用,参数为函数,第一个函数得到成功结果,第二个函数得到失败结果
var p = new Promise(function(resolve, reject){
resolve()
})
p.then(function(success){
console.log(success)
}, function(error){
console.log(error)
})
Promise.prototype.catch()
捕获失败状态
Promise.prototype.finally()
es2018中添加,无论状态是什么都会去执行
Promise.all()
Promise.all([p1, p2, p3]) // p1,p2,p3都为promise对象
Promise.race()
Promise.race([p1, p2, p3]) // p1,p2,p3都为promise对象
Promise.resolve()
将现有对象转化为Promise对象
- 参数是一个Promise实例,那么Promise.resolve将不做任何修改,直接返回这个实例
-
参数是一个thanable对象,具有then方法的对象
let thanable = { then: function(resolve, reject){ resolve(2332) } } let p1 = Promise.resolve(thenable) p1.then(function(value) { console.log(value) // 2332 })
Promise.resolve方法将会把这个对象转化为Promise对象,并立即执行thenable的then方法
-
参数不是具有then方法的对象,或者不是对象。是一个原始值,则直接返回Promise对象,状态为resolved
var p = Promise.resolve('hello') p.then(function(value){ console.log(value) // hello })
- 不带有任何参数,直接返回一个resolved状态的Promise对象
Promise.reject()
Promise.reject(reason)
方法会返回一个新的Promise实例,状态为rejected
const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))
p.then(null, function (s) {
console.log(s)
});
// 出错了