美文网首页
58.异步演进从Promise到async/await

58.异步演进从Promise到async/await

作者: wo不是黄蓉 | 来源:发表于2022-02-19 21:56 被阅读0次

day10:1.以下代码会同时输出

//模拟一个异步的代码
setTimeout(() => {
  console.log("settimeout1");
}, 1000);
setTimeout(() => {
  console.log("settimeout2");
}, 1000);

2.如果想要2在1之后并且在1秒钟之后输出->这就是所说的回调地狱的问题,看起来很麻烦,而且层层嵌套

setTimeout(() => {
  console.log("settimeout1");
  setTimeout(() => {
    console.log("settimeout2");
  }, 1000);
}, 1000);

3.使用promise进行改进,使用链式调用的方式-》在第一个promise结果里面返回下一个异步代码快就可以

let promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("第1个异步代码");
    resolve("promise1 resolve->第1个异步代码");
  }, 1000);
});
promise1
  .then((res) => {
    console.log(res);
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log("第2个异步代码");
        resolve("promise2 resolve->第2个异步代码");
      }, 1000);
    });
  })
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  });

3.1若想第一个返回报错之后后面的不往下执行

let promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("第1个异步代码");
    reject("promise1 reject->第1个异步失败代码"); //第一种:使用reject
  }, 1000);
});
promise1
  .then((res) => {
    console.log(res);
    //第二种:使用抛出异常的方式
    throw new TypeError("there is somthing wrong");
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log("第2个异步代码");
        resolve("promise2 resolve->第2个异步代码");
      }, 1000);
    });
  })
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  });

4.promise异步演async和await
插一句:async中不一定要有await但是用await必须要写async

async function testAsync() {
  let res1 = await new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("第1个异步代码");
      resolve("promise1 resolve->第1个异步代码");
    }, 1000);
  });
  console.log(res1);
  let res2 = await new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("第2个异步代码");
      resolve("promise2 resolve->第2个异步代码");
    }, 1000);
  });
  console.log(res2);
}
testAsync();

这个时候代码看起来就很想同步代码的执行了,但是在testAsync函数前后写同步代码会发生什么事情呢?

testAsync();
console.log("========================");

此时会发现分割线代码会先执行,然后再执行testAsync函数,这是为什么呢?
因为testAsync、console都是同步代码,在执行到testAsync执行栈的时候会注册一个微任务。此时promise会被放入待执行队列中,等到所有的同步代码,也就是console执行完之后,事件循环机制查找到任务队列中还有异步任务没有执行时这时才开始执行异步任务。

相关文章

  • 58.异步演进从Promise到async/await

    day10:1.以下代码会同时输出 2.如果想要2在1之后并且在1秒钟之后输出->这就是所说的回调地狱的问题,看起...

  • Promise和async/await

    Promise和async/await都是异步处理的方法。async/await看起来更简单易用。 Promise...

  • Async/Await VS Promise

    Async/Await VS Promise Async/await 是一种编写异步代码的新方法。之前异步代码的方...

  • 总结知识点

    1:promise解决了回调地狱和异步async和await var promise = new Promise(...

  • 异步

    解决异步的方案: Promise方案: .平~~~~~ async/await方案: 例如:

  • JavaScript 中 async 和 await 的基本理解

    async/await是什么 async/await 是ES7提出的基于Promise的解决异步的最终方案。 as...

  • 【Dart】异步函数

    异步函数 JavaScript中,异步调用通过Promise来实现async函数返回一个Promise。await...

  • Async/Await替代Promise的6个理由

    Async/Await简介 async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 a...

  • Async/Await简介与用法

    简介 async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await是...

  • async/await和Promise杂谈

    前言 Promise和async/await是当前前端最常见的异步程序处理方式,async/await是基于Pro...

网友评论

      本文标题:58.异步演进从Promise到async/await

      本文链接:https://www.haomeiwen.com/subject/rbaplrtx.html