Promise

1.什么是Promise?

Promise是一个构造函数,它有三种状态,peading,fulfilled,resolved分别对应  等待,成功,失败这三种状态。

2.在Promise原型链上挂载的方法

代码:

  let a = new Promise((resolve, reject) => {});
  console.log(a);

图示:

(1)等待的状态

Promise_第1张图片

(2)方法

Promise_第2张图片

(3)状态的总结

什么都不干是peading状态.

(1)成功的状态

 let a = new Promise((resolve, reject) => {
      resolve(2)
    });
    console.log(a);

Promise_第3张图片

    (2)用then方法获取成功的值

 let a = new Promise((resolve, reject) => {
      resolve(2);
    }).then((res) => {
      console.log(res, "成功的值");
    });

(3)图示

Promise_第4张图片

(3)失败的状态

let a = new Promise((resolve, reject) => {
      reject(3);
    })
      .then((res) => {
        console.log(res, "成功的值");
      })
      .catch((reject) => {
        console.log(reject, "失败的值");
      });

通过.catch能够获取失败的值

(4)finallly

备注:无论成功和失败都会经过

 let a = new Promise((resolve, reject) => {
      reject(3);
    })
      .then((res) => {
        console.log(res, "成功的值");
      })
      .catch((reject) => {
        console.log(reject, "失败的值");
      })
      .finally(() => {
        console.log("11");
      });

3.回调地狱

(1)在没有Promise之前,异步的任务处理方式:

 setTimeout(() => {
      console.log("吃饭");
      setTimeout(() => {
        console.log("睡觉");
        setTimeout(() => {
          console.log("打豆豆");
        }, 3000);
      }, 4000);
    }, 5000);

Promise_第5张图片

(2)代码2


    
    
  

获取第一个接口的参数之后,立马将获取的参数,传入第二个接口,可以看出代码非常乱的。

Promise_第6张图片

Promise_第7张图片

4.使用Promise链式调用






Promise_第8张图片

可以看出已经获取到了数据。

5.通过async和await来调用






这是Es7推出的新语法,这样看起来是不是又更加的简洁明了。

6.用async标记的函数

代码:

async function fn(){
  return 2
}
console.log(fn());

返回的结果:

Promise_第9张图片

7.await阻塞问题 

1.转换的例子

Promise_第10张图片

2.表现

用同步写代码的方式获取异步的结果,所谓的阻塞只不过是表现的形式不同。

3.转换的例子

  async function m() {
      console.log(0);
      const n = await 1;
      // Promise.resolve(1)
      console.log(n); //
    }
    m();
    console.log(2);

    // async function m() {
    //   return Promise.resolve(1).then((n) => {
    //     console.log(n);
    //   });
    // }
    // 给n复制和打印n是在异步队列,打印玩0任务直接结束

思路:首先打印0 然后 等待n和打印n的代码加入为任务队列中,转换之后的代码:

  return Promise.resolve(1).then((n) => {
    //     console.log(n);
    //   });

此时这个函数已经结束。.

8.async await的笔试题

async function async1() {
  console.log("async1 start");
  await async2();
  console.log("async1 end");
}
async function async2() {
  console.log("async2");
}

console.log("script start");

setTimeout(function () {
  console.log("setTimeout");
}, 0);

async1();

new Promise(function (resolve) {
  console.log("promise1");
  resolve();
}).then(function () {
  console.log("promise2");
});
console.log("script end");

Promise_第11张图片

分析思路:

  1.同步执行  console.log("script start");

  2.执行   async1();  console.log("async1 start"); 等待async2()函数返回Promise的状态,并将后面的代码加入微任务的队列    微1: console.log("async1 end");  执行async2(),    console.log("async2"); 如果什么都没返回默认返回   //   return Promise.resolve(undefined),将定时器的代码加入宏任务队列,  console.log("setTimeout");在执行  console.log("promise1");  后面的代码加入微任务队列2  console.log("promise2");然后在执行 同步   console.log("script end"); 执行微1,微2,宏任务即可。           

你可能感兴趣的:(js笔试题,前端,javascript,开发语言)