Promise对象及常⽤⽅法
Promise对象
Promise 对象代表了未来将要发⽣的事件,开创⼀个异步线程,⽤来传递异步操作的消息。
Promise 对象有以下两个特点:
1.对象的状态不受外界影响。Promise 对象代表⼀个异步操作,有三种状态:
  pending: 初始状态,不是成功或失败状态
  fulfilled: 意味着操作成功完成
rejected: 意味着操作失败
2.只有异步操作的结果,可以决定当前是哪⼀种状态,任何其他操作都⽆法改变这个状态。
Promise 对象的状态改变,只有两种可能:
1.从 Pending 变为 Resolved
2.从 Pending 变为 Rejected。
只要这两种情况发⽣,状态就凝固了,不会再变了,会⼀直保持这个结果。就算改变已经发⽣了,再对 Promise 对象添加回调函数,也会⽴即得到这个结果。
Promise 优缺点:
优点:
Promise 对象提供统⼀的接⼝,使得控制异步操作更加容易,避免了层层嵌套的回调函数。
缺点:
1.⽆法取消 Promise,⼀旦新建它就会⽴即执⾏,⽆法中途取消。
2.如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部
3.当处于 Pending 状态时,⽆法得知⽬前进展到哪⼀个阶段(刚刚开始还是即将完成)
创建Promise
let prom = new Promise((resolve, reject)=>{
// 异步处理,处理结束后调⽤resolve或reject
// 当异步代码执⾏成功时,我们才会调⽤resolve(...), 当异步代码失败时就会调⽤reject(...)
// 在本例中,我们使⽤setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的⼀些API⽅法.
setTimeout(()=>{
resolve("成功!"); //代码正常执⾏!
}, 250);
})
prom.then((result)=>{
// result的值是上⾯调⽤resolve(...)⽅法传⼊的值.
// result参数不⼀定⾮要是字符串类型,这⾥只是举个例⼦
console.log("result:" + result)    // 打印结果: result:成功!
})
Promise.then()
对于已经实例化过的 promise 对象可以调⽤ promise.then() ⽅法,传递 resolve 和 reject ⽅法作为回调。
  promise.then() 是 promise 最为常⽤的⽅法。
  promise.then(onResolved, onRejected)
function p(){
createprocessalet a = 1
return new Promise(resolve => {
resolve(a)    // 将参数a传递给then()
})
}
p().then((val) => {
console.log("a:"+val)  // a:1
})
Promise.then()可以采⽤链式写法
Promise.prototype.then ⽅法返回的是⼀个新的 Promise 对象,因此可以采⽤链式写法
例:
function p(){
let a = 1
return new Promise(resolve => {
resolve(a)    // 将参数a传递给then()
})
}
p().then((val) => {
return val+1
}).then((val) => {
console.log(val + 2)  // 4
})
Promise.Catch()捕捉错误
Promise.Catch()⽤于指定发⽣错误时的回调函数
Promise 对象的错误具有"冒泡"性质,会⼀直向后传递,直到被捕获为⽌。也就是说,错误总是会被下⼀个 catch 语句捕获。
function p(){
let a = 1
return new Promise(resolve => {
resolve(a)    // 将参数a传递给then()
})
}
p().then((val) => {
console.log(val + 2)  // 4
}).catch((error) => {
console.log("error:", error)
})
Promise.all⽅法
Promise.all ⽅法⽤于将多个 Promise 实例,包装成⼀个新的 Promise 实例
var p = Promise.all([p1,p2,p3]);
上⾯代码中,Promise.all ⽅法接受⼀个数组作为参数,p1、p2、p3 都是 Promise 对象的实例。
(Promise.all ⽅法的参数不⼀定是数组,但是必须具有 iterator 接⼝,且返回的每个成员都是 Promise 实例。)
p 的状态由 p1、p2、p3 决定,分成两种情况:
只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成⼀个数组,传递给p的回调函数。
只要p1、p2、p3之中有⼀个被rejected,p的状态就变成rejected,此时第⼀个被reject的实例的返回值,会传递给p的回调函数。例:
Promise.all()返回⼀个Promise返回值的数组
function createProcess(str){
return new Promise(resolve => {
setTimeout(() => {
resolve(str)
}, 1000 )
})
}
let p0 = createProcess("0")
let p1 = createProcess("1")
let p2 = createProcess("2")
let p3 = createProcess("3")
let promises = [p0, p1, p2, p3]
Promise.all(promises).then(pro => {
console.log(pro)        // [ '0', '1', '2', '3' ]
})

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。