1.概述
Promise是一步编程的一种解决方案,从语法上讲,promise是一个对象,从它可以获取异步的问题
Promise的优点:
可以避免多次异步调用嵌套导致的回调地域
提供了简洁的api,使得控制异步变得简单更加容易
详细promise使用规则https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
2.使用
实例化Promise对象,构造函数中传递参数,该函数用于传递异步任务
resolve和reject两个参数用于 处理成功和失败的两种情况,并通过p.then获取处理结果
代码实列:
1 var p = new Promise(function (resolve, reject) { 2 //用于实现异步任务 3 setTimeout(function () { 4 var flag = true 5 if (flag) { 6 resolve('成功') 7 } else { 8 reject('失败') 9 } 10 }) 11 },1000) 12 p.then(function (success) { 13 //这里面是成功了要执行的操作 14 console.log(success); 15 }, 16 function (error) { 17 //这里面是失败了要进行的操作 18 console.log(error); 19 })
3.使用Promise发送Ajax请求
先封装一个函数,可以重复调用。
1
// })
function P(url) {
var p = new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest()
xhr.open('get', url, true)
xhr.onreadystatechange = function (res, req) {
if (req.status === 200) {
resolve(req.responseText)
} else {
reject('错误')
}
}
xhr.send()
})
}
var URL = "api地址";
P(URL).then(function onFulfilled(value) {
console.log(value);
}).catch(function onRejected(error) {
console.log(error);
});
4.Promise的实列方法
p.then()得到异步任务的正确结果
p.catch()获取异常信心
p.finally()无论正确还是错误都会执行(不是正式版本)
1 P().then(function (data) { 2 console.log(data); 3 }) 4 P().catch(function (data) { 5 console.log(data); 6 }) 7 p().finally(function (data) { 8 console.log(data); 9 })
5.Promise的对象方法
Promise.all()并发处理多个任务,所有任务都执行完成才能得到结果
Promise.race()并发处理多个异步任务,只要有一个任务完成就能得到结果
all用法
1 var a=p(url1) 2 var b=P(url2) 3 var c=P(url3) 4 Promise.all([a,b,c]).then(function(data){ 5 console.log(data); 6 })
控制台得到的data是三个实列都执行完成后才会输出log
race用法
1 var a = p(url1) 2 var b = P(url2) 3 var c = P(url3) 4 Promise.race([a, b, c]).then(function (data) { 5 console.log(data); 6 })
其中只要有一个实列执行完成后就会输出log,用法跟all相同,只不过执行条件不同