promise是什么
Promise是最早由社区提出和实现的一种解决异步编程的方案, 是解决异步处理回调地域问题而产生的
ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
基本使用
promise的三种状态和基础使用
promise有三种状态: pending就是未解决,resolve:成功,reject:失败。
一个简易的promise例子:
let promiseDemo = new Promise((resolve, reject) => {
// code resolve('success')
// code reject('failed')
})
promiseDemo.then((result) => {
console.log(result)
}, (result) => {
console.log(result)
})
Promise.prototype.then()
and Promise.prototype.catch()
返回promise,可以链式调用.
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('foo');
}, 300);
});
//.then()return新生成的promise对象,该对象可以用于链接;
myPromise
.then(handleResolvedA, handleRejectedA)
.then(handleResolvedB, handleRejectedB)
.then(handleResolvedC, handleRejectedC);
项目使用promise真实代码
//请求第一个API
$.ajax({
url: 'https://www. easy- mock. com/mock/5a52256ad408383e0e3868d7/lagou/city',
success (resCity) {
let findCityId = resCity. filter(item = {
if (item.id == 'c1') {
return item
}
})[0].id
$.ajax({
// 请求第二个API
url: ' url1' ,
success ( resPosition) {
let findPostionId = resPosition. filter(item => {
if(item. cityId == findCityId) {
return item
}) [0].id
// 请求第三个API:根据上一个API的id( findPostionId)找到具体公司, 然后返回公司详情
$. ajax({
url: 'url2' ,
success (resCom) {
let comInfo = resCom. filter(i tem
{
if (findPostionId == item.id) {
return item
}) [0]
console. Log( comInfo)
}
})
})
Promise.all()
Promise.all( iterable ) ( 注:Array,Map,Set都属于ES6的iterable类型 )用于将多个Promise实例,包装成一个新的Promise实例 ;
它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
Promise.race()
Promise.race(iterable)
方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
// Both resolve, but promise2 is faster
});
// expected output: "two"