async / await 和 Promise 的关系

3 篇文章 0 订阅

背景:

1.异步回调地狱 callback hell;

2.Promise 是基于 then catch 的链式调用,但也是基于回调函数;

3. async / await 是同步语法去编写异步代码,彻底消灭回调函数,但它也只是一个语法糖,从语法层面去解决 回调地狱;

关系:

async / await 和 Promise 并不互斥,二者相辅相成。

async / await 并不能改变异步的本质( js是单线程的,异步需要回调,都是要基于 event loop 来实现)。

await 后面的代码,都可以看做是异步回调 callback 里的内容,都是异步的。

1.执行 async 函数,返回的是 Promise 对象;

2. await 相当于 Promise 的 then;

3.用 try...catch 捕获异常,代替了 Promise 的 catch;

async function fn() {
  return 100;
}
(async function () {
  const a = fn(); // Promise 对象
  const b = await fn(); // 100
})()
!(async function () {
  const p1 = Promise.resolve(200);
  const data = await p1; // await 相当于 Promise then
  console.log('data', data); // 200
})();

!(async function () {
  const data = await 300; // await 相当于 Promise.resolve(300)
  console.log('data', data); // 300 
})();

// try...catch 相当于 Promise catch
!(async function () {
  const p2 = Promise.reject('error');
  try {
    const data = await p2;
    console.log('data2', data);
  } catch (err) {
    console.log('err', err); // error
  }
})();

使用场景:

// 打印顺序
async function async1() {
  console.log('async1 start'); // 2
  await async2();
  // await 后面都可看作是 callback 里的内容,同步代码执行完毕 再执行异步内容
  console.log('async1 end'); // 5
};
async function async2() {
  console.log('async2'); // 3
}

console.log('script start'); // 1
async1();
console.log('script end'); // 4



// 打印顺序--进阶
async function async1() {
  console.log('async1 start'); // 2
  await async2();
  // await 后面都可看作是 callback 里的内容,同步代码执行完毕 再执行异步内容
  console.log('async1 end'); // 5
  await async3();
  // 下面是回调的内容
  console.log('async1 end end'); // 7
};
async function async2() {
  console.log('async2'); // 3
}

async function async3() {
  console.log('async3'); // 6
}

console.log('script start'); // 1
async1();
console.log('script end'); // 4

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
async/awaitPromise都是JavaScript中处理异步编程的方式,但是它们有一些不同之处。 Promise是一种异步编程的解决方案,它可以将异步操作封装成一个Promise对象,通过链式调用then()和catch()方法来处理异步操作的结果或错误。Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。 async/await是ES2017引入的异步编程解决方案,它可以让异步代码看起来像同步代码,使得代码更加易读易懂。async函数是返回一个Promise对象的函数,并且在函数内部可以使用await关键字来等待一个Promise对象的结果。当await关键字后面的Promise对象状态变为fulfilled时,await表达式的值就是Promise对象的resolve值,如果Promise对象状态变为rejected,则会抛出一个错误。 下面是一个使用Promiseasync/await实现异步操作的例子: 使用Promise实现异步操作: ```javascript function getData() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('data'); }, 1000); }); } getData().then(data => { console.log(data); // 输出:data }).catch(error => { console.log(error); }); ``` 使用async/await实现异步操作: ```javascript async function getData() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('data'); }, 1000); }); } async function main() { try { const data = await getData(); console.log(data); // 输出:data } catch (error) { console.log(error); } } main(); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值