面试题 - 图1面试题 - 图2

任务队列机制:

  1. 先知道是否执行的微任务,能够更早执行 ```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. 两个
  2. 1. **Promise.**resolve() :直接返回一个成功的
  3. 1. **Promise.**reject() :直接返回一个失败的
  4. 1. **Promise.all**([promise数组:{要求数组中的每一项尽可能都是promise实例}]):返回一个新的promise实例AAAA成功还是失败,取决于数组中的每一个promise实例是成功还是失败,只要有一个是失败,AA就是失败的,只有都成功AA才是成功的
  5. 1. **Promise.race**:最先知道状态的promise实例,是成功还是失败,决定了AA是成功还是失败 api1 / api2 / api3 哪一个接口返回的最快 就最先处理谁 (用处比较少))
  6. ```javascript
  7. // 需求 页面加载前同时发送 多个请求 并且请求都成功后再渲染页面
  8. function fn(interval) {
  9. return new Promise((resolve, reject) => {
  10. setTimeout(() => {
  11. resolve(interval);
  12. }, interval);
  13. });
  14. }
  15. let p1 = fn(3000);
  16. let p2 = fn(1000);
  17. // let p3 = Promise.resolve(0);
  18. let p3 = Promise.reject(0);
  19. // promise数组最慢的执行完才执行这里
  20. Promise.all([p1, p2, p3]).then(results => {
  21. // 不论谁先知道状态,最后结果的顺序和传递数组的顺序要保持一致 如果都是成功的答案是:[3000, 1000, 0]
  22. console.log(results);
  23. }).catch(reason => {
  24. // 处理过程中,遇到一个失败,则All立即为失败,结果就是当前实例失败的原因
  25. console.log(reason); 如果有个失败则返回失败的:0
  26. });
  1. // 需求
  2. // 串行 api1 / api2 / api3
  3. // 回调函数方式
  4. const api1 = () => {
  5. return new Promise(resolve => {
  6. $.ajax({
  7. url: '/api1',
  8. success(result1) {
  9. resolve(result1);
  10. }
  11. });
  12. });
  13. };
  14. const api2 = () => {
  15. return new Promise(resolve => {
  16. $.ajax({
  17. url: '/api2',
  18. success(result2) {
  19. resolve(result2);
  20. }
  21. });
  22. });
  23. };
  24. const api3 = () => {
  25. return new Promise(resolve => {
  26. $.ajax({
  27. url: '/api3',
  28. success(result3) {
  29. resolve(result3);
  30. }
  31. });
  32. });
  33. };
  34. // 串行
  35. api1().then(result1 => {
  36. return api2();
  37. }).then(result2 => {
  38. return api3();
  39. }).then(result3 => {
  40. });
  41. // 并行
  42. Promise.all([api1(), api2(), api3()]).then(results => {
  43. });