async 整理

本文详细介绍了async函数、await关键字在JavaScript中的使用,探讨了它们如何解决异步问题,以及如何通过语法糖将异步代码转化为更易读的形式。涵盖了await的用法、await值来源和await在async函数中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

async

async 函数

  • async 关键字 写在函数的前面 叫 async 函数

  • 作用: 用于解决异步程序产生的 bug.

  • async 函数只要执行就会返回 promise 实例对象

  • 因此对async函数可以直接then,返回值就是then方法传入的函数。

  • async 本身是一个语法糖

    • 语法糖:带有一定功能的关键字
    • 功能:创建并返回一个 promise 实例
async function foo(p) {
  console.log("foo run", p);  //foo run 1

  // promise.[[PromiseValue]]中
  return 1;
}
var res = foo(1);
console.log(res);  // Promise {<fulfilled>:1}

var bar = (async function () {})(async function () {});

var obj = {
  async bar() {
    console.log("121234567");  //121234567
    return 123;
  },
  foo: async () => {},
  test: function () {},
};
console.log(obj.bar());  //Promise {<fulfilled>:123}

// 输出:foo run 1  Promise {<fulfilled>:1}   121234567     Promise {<fulfilled>:123}

async 函数 return

  • await 关键字只能用在 aync 定义的函数内。async 函数会隐士地返回一个 promise,该 promise 的 reosolve 值就是函数 return 的值。

  • 也可以通过函数返回值的方式

async function foo() {
  console.log("foo run");
  return 123;
}

// res 作用:接受 async foo 函数返回值  是promise
let res = foo();
// res = async return
// res = new Promise()
// res = promises实例

async 中的 await

await

  • await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。

  • await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;

  • 它也是:

    • async/await 是写异步代码的新方式,以前的方法有回调函数和 promise
    • async/await 是基于 promise 实现的,他不能用于普通的函数
    • async/await 与 promise 一样,是非阻塞的
    • async/await 使得异步代码看起来像同步代码
  • 1: await 需要在 async 中写

  • 2: 后是 promise 实例

  • 3: await 作用 获取 promise.[[PromiseValue]]的值

  • [[PromiseValue]]那些能赋值:

    • 1: async 函数的 return
    • 2: new promise 中的 resolve 实参
    • 3: then 中 return (catch finally 中 return)
    • 4: Promise.resolve()实参 Promise.reject()实参

    await[[PromiseValue]]取值

    (async () => {
      // resole 实参去哪了  ---->  p.[[promiseValue]]
      let p = new Promise((resolve, reject) => {
        resolve(123);
      });
      console.log(p);
    
      //    Promise.resove() 实参去哪了 ----->  p1.[[promiseValue]]
      let p1 = Promise.resolve("234");
      console.log(p1);
    
      // then-callback 的retrun去哪里了 ----> p2.[[promiseValue]]
      let p2 = p1.then((res) => 456);
      console.log(p2);
    
      // foo的return 的中去哪的?   ------> p3.[[promiseValue]]
      async function foo() {
        return 789;
      }
    
      let p3 = foo();
      console.log(p3);
    
      // awiat 开始你的表演..................
    
      // res作用是接受 await 的返回值
      let res = await p;
      console.log(res); // 123
      let res1 = await p1;
      console.log(res1); // 234
      let res2 = await p2;
      console.log(res2); // 456
      let res3 = await p3;
      console.log(res3); // 789
      // 综上所诉
      // 语法: await promise实例
      // 作用:  获取 promise实例.[[PromiseValue]] 的值
    })();
    
  • [[promiseValue]] 赋值 查询有哪些方式

    • [[promiseState]]:fufiled 状态赋值:赋值:

      • resolve() 实参
      • then-callback return
      • catch-callback return
      • finally-callback return
      • Promise.resolve() 实参
    • [promiseState]]:fufiled 状态赋值:读取值;

      • then-callback 形参
      • await 返回值

同步程序异步写法

  • 同步写法…实际上异步程序
  • 等 await 执行结束 执行下一个 await
  • ------> 解决异步问题导致问题程序运行 bug
(async () => {
  let p = new Promise((resolve, reiect) => {
    setTimeout(() => {
      resolve(111);
    }, 1000);
  });
  let p1 = new Promise((resolve, reiect) => {
    setTimeout(() => {
      resolve(222);
    }, 500);
  });
  let p2 = new Promise((resolve, reiect) => {
    setTimeout(() => {
      resolve(333);
    }, 1000);
  });

  console.log("同步111111111111111");
  p.then((res) => {
    console.log(res);
  });
  p1.then((res) => {
    console.log(res);
  });
  p2.then((res) => {
    console.log(res);
  });
  console.log("22222222222222222");
})();

// 输出:  11111111111   222222222222222    222   111  333  
<think>好的,用户想了解C++中async函数的用法和相关问题。首先,我需要回忆一下C++11引入的std::async以及相关的功能。std::async是用来异步执行函数,并返回一个std::future对象,以便在之后获取结果。用户可能需要知道基本用法、参数选项、异常处理以及线程池的关系。 根据用户提供的引用内容,特别是引用[2]提到线程池的实现原理和回调函数的使用,用户可能对async与线程池的配合使用感兴趣。需要说明std::async默认是否使用线程池,或者如何结合两者。 接下来,我需要整理async的常用方法,比如启动策略(std::launch::async和std::launch::deferred),以及如何通过future获取结果。还需要举几个例子,比如计算斐波那契数列或者处理多个任务,这样用户能更直观地理解。 另外,用户可能关心异常处理,因为在异步任务中异常无法直接捕获,必须通过future对象来获取。这部分需要详细说明。 还要注意用户提到的引用[1]中的ROS2节点创建,虽然可能与async没有直接关系,但可能在异步任务处理的应用场景中有联系,比如在ROS2中使用async处理回调,但这里可能需要避免混淆,专注于标准库的async。 需要确保回答结构清晰,分点说明用法、示例、注意事项,并生成相关问题。同时检查是否符合格式要求,比如行内公式用$...$,代码块正确,引用标识正确添加。</think>### C++中async函数用法详解 #### 一、基本概念 C++11引入的$std::async$函数用于异步执行任务,返回一个$std::future$对象存储计算结果。其核心特性包括: 1. 支持延迟执行($std::launch::deferred$) 2. 强制异步执行($std::launch::async$) 3. 自动回收线程资源[^2] #### 二、核心用法 ```cpp #include <future> #include <iostream> int add(int a, int b) { return a + b; } int main() { // 启动异步任务 auto future = std::async(std::launch::async, add, 10, 20); // 获取结果(阻塞等待) std::cout << "Result: " << future.get() << std::endl; return 0; } ``` #### 三、启动策略对比 | 策略类型 | 行为特征 | |--------------------------|-----------------------------------| | $std::launch::async$ | 强制创建新线程执行 | | $std::launch::deferred$ | 延迟到调用get()/wait()时同步执行 | #### 四、高级应用场景 1. **并行计算** ```cpp auto future1 = std::async([]{ return compute(1); }); auto future2 = std::async([]{ return compute(2); }); auto result = future1.get() + future2.get(); ``` 2. **异常处理** ```cpp try { auto future = std::async([]{ throw std::runtime_error("error"); }); future.get(); } catch(const std::exception& e) { std::cerr << e.what() << std::endl; } ``` 3. **结合线程池使用** 虽然$std::async$本身不直接管理线程池,但可通过自定义分配器实现类似效果: ```cpp // 使用线程池执行异步任务 auto future = std::async(thread_pool_executor, heavy_task); ``` #### 五、性能注意事项 1. 默认策略可能重用线程(取决于实现) 2. 频繁创建任务应考虑线程池方案 3. 返回值类型必须可拷贝或可移动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值