06-Promise的一些题目

Promise 的执行顺序

题目 1

代码举例:

  1. const p = new Promise((resolve, reject) => {
  2. console.log(1);
  3. });
  4. console.log(2);

打印结果:

  1. 1
  2. 2

我们需要注意的是:Promise 里的代码整体,其实是同步任务,会立即执行。

补充:上面的代码中,如果继续写p.then(),那么 then()里面是不会执行的。因为在定义 promise 的时候需要写 resolve,调用 promise 的时候才会执行 then()

基于此,我们再来看下面这段代码:

  1. const p = new Promise((resolve, reject) => {
  2. console.log(1);
  3. resolve();
  4. });
  5. console.log(2);
  6. p.then((res) => {
  7. console.log(3);
  8. });

打印结果:

  1. 1
  2. 2
  3. 3

题目 2

代码举例:

  1. // 封装 ajax 请求:传入回调函数 success 和 fail
  2. function ajax(url, success, fail) {
  3. var xmlhttp = new XMLHttpRequest();
  4. xmlhttp.open('GET', url);
  5. xmlhttp.send();
  6. xmlhttp.onreadystatechange = function () {
  7. if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
  8. success(xmlhttp.responseText);
  9. } else {
  10. fail(new Error('接口请求失败'));
  11. }
  12. };
  13. }
  14. new Promise((resolve, reject) => {
  15. ajax('a.json', (res) => {
  16. console.log('a接口返回的内容:' + res);
  17. resolve();
  18. });
  19. })
  20. .then((res) => {
  21. console.log('a成功');
  22. new Promise((resolve, reject) => {
  23. ajax('b.json', (res) => {
  24. console.log('b接口返回的内容:' + res);
  25. resolve();
  26. });
  27. });
  28. })
  29. .then((res) => {
  30. // 因为上面在b接口的时候,并没有 return,也就是没有返回值。那么,这里的链式操作then,其实是针对一个空的 promise 对象进行then操作
  31. console.log('b成功');
  32. });

打印结果:

  1. a接口返回的内容
  2. a成功
  3. b成功
  4. b接口返回的内容

题目 3

举例1:

  1. new Promise((resolve, reject) => {
  2. resolove();
  3. console.log('promise1'); // 代码1
  4. }).then(res => {
  5. console.log('promise then)'; // 代码2:微任务
  6. })
  7. console.log('千古壹号'); // 代码3

打印结果:

  1. promise1
  2. 千古壹号
  3. promise then

代码解释:代码1是同步代码,所以最先执行。代码2是微任务里面的代码,所以要先等同步任务(代码3)先执行完。

当写完resolove();之后,就会立刻把 .then()里面的代码加入到微任务队列当中。