任务队列机制:
- 先知道是否执行的微任务,能够更早执行
```javascript
new Promise(resolve => {
console.log(‘promise1’);
resolve(); // 1. 修改了promise1状态为成功, 没有then可执行 }).then(() => { // 2. 添加到微任务队列 微任务1 同步结束就开始执行 console.log(‘then11’); // 4. 开始执行微任务1,输出 then11 // return new Promise(resolve => { // 没有renturn,不返回promise console.log(‘promise2’); // 输出 promise2 resolve(); // 5. 修改了promise2状态为成功, 没有then可执行 }).then(() => { // 6. 添加到微任务队列 微任务3 这里由于已经知道成功了,就一定会主线程空闲时马上执行,比 微任务2先知道能够执行 console.log(‘then21’); }).then(() => { // 7. 添加到微任务队列 微任务4 执行完3后, loop又从最上面开始看,而不是直接往下执行 console.log(‘then22’); }); }).then(() => { // 3. 添加到微任务队列 微任务2 还未知道微任务1 代码执行情况,他要等到知道执行情况后才执行 console.log(‘then12’); });
// 加return
new Promise(resolve => {
console.log(‘promise1’);
resolve(); // 1. 修改了promise1状态为成功, 没有then可执行
}).then(() => { // 2. 添加到微任务队列 微任务1 同步结束就开始执行
console.log(‘then11’); // 4. 开始执行微任务1,输出 then11
return new Promise(resolve => { // 有renturn ,任务2最后才执行
console.log(‘promise2’);
resolve();
}).then(() => {
console.log(‘then21’);
}).then(() => {
console.log(‘then22’);
});
}).then(() => { // 3. 添加到微任务队列 微任务2 还未知道微任务1 代码执行情况,他要等到知道执行情况后才执行
console.log(‘then12’);
});
两个
1. **Promise.**resolve() :直接返回一个成功的
1. **Promise.**reject() :直接返回一个失败的
1. **Promise.all**([promise数组:{要求数组中的每一项尽可能都是promise实例}]):返回一个新的promise实例AA,AA成功还是失败,取决于数组中的每一个promise实例是成功还是失败,只要有一个是失败,AA就是失败的,只有都成功AA才是成功的
1. **Promise.race**:最先知道状态的promise实例,是成功还是失败,决定了AA是成功还是失败 ( api1 / api2 / api3 哪一个接口返回的最快 就最先处理谁 (用处比较少))
```javascript
// 需求 页面加载前同时发送 多个请求 并且请求都成功后再渲染页面
function fn(interval) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(interval);
}, interval);
});
}
let p1 = fn(3000);
let p2 = fn(1000);
// let p3 = Promise.resolve(0);
let p3 = Promise.reject(0);
// promise数组最慢的执行完才执行这里
Promise.all([p1, p2, p3]).then(results => {
// 不论谁先知道状态,最后结果的顺序和传递数组的顺序要保持一致 如果都是成功的答案是:[3000, 1000, 0]
console.log(results);
}).catch(reason => {
// 处理过程中,遇到一个失败,则All立即为失败,结果就是当前实例失败的原因
console.log(reason); 如果有个失败则返回失败的:0
});
// 需求
// 串行 api1 / api2 / api3
// 回调函数方式
const api1 = () => {
return new Promise(resolve => {
$.ajax({
url: '/api1',
success(result1) {
resolve(result1);
}
});
});
};
const api2 = () => {
return new Promise(resolve => {
$.ajax({
url: '/api2',
success(result2) {
resolve(result2);
}
});
});
};
const api3 = () => {
return new Promise(resolve => {
$.ajax({
url: '/api3',
success(result3) {
resolve(result3);
}
});
});
};
// 串行
api1().then(result1 => {
return api2();
}).then(result2 => {
return api3();
}).then(result3 => {
});
// 并行
Promise.all([api1(), api2(), api3()]).then(results => {
});