首页 > 其他分享 >async/await初始

async/await初始

时间:2022-11-07 15:00:30浏览次数:46  
标签:console log await value async foo gen 初始 const

async/await是用来解决异步的,常用的解决异步方法是用Promise,如下:

function foo() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(1)
    }, 2000)
  })
}

foo().then(res => {
  console.log(res); // 2s后输出1
})

但是如果有很多个.then,那么看起来逻辑也很复杂了,所以可以使用async、await来解决异步,如下:

function foo1() {
 return new Promise((resolve) => {
    setTimeout(() => {
      resolve(1)
    }, 2000)
  })
}

function foo2() {
 return new Promise((resolve) => {
    setTimeout(() => {
      resolve(2)
    }, 2000)
  })
}

async function foo() {
  const result1 = await foo1();
  console.log(result1); // 2s后打印1
  const result2 = await foo2();
  console.log(result2); // 4s后打印2
}

console.log(foo()); // [<pending>]

如上,发现await后面总是跟着Promise,并且async函数返回的是一个Promise。
当await后面不跟Promise的时候,会立即执行,不会阻碍后面的代码。

async function foo() {
  await setTimeout(() => {
    console.log(1)
  }, 2000);
  console.log(2);
}
foo(); // 2, 1

async、await相当于是generator的语法糖,generator函数是一种特殊的函数,前面会带有一个*,它里面可以使用yield来对函数内部的执行暂停,然后返回一个{value, done}类型的对象,value表示yield后面的值,如果是函数的话会立即执行函数,将函数的返回值给value,done则表示是否走到头了,当走到最后一层的时候,done为true,value为return的值。

function * foo() {
  yield 1;
  yield foo1();
  return 4;
}

function foo1() {
  console.log(2)
  return 3;
}

const gen = foo();
console.log(gen); // 生成器对象
const result = gen.next();
console.log(result, result.value); // { value: 1, done: false } 1
const result1 = gen.next();
console.log(result1, result1.value); // 2 { value: 3, done: false } 3
const result2 = gen.next();
console.log(result2, result2.value); // { value: 4, done: true } 4

可以通过next去传递参数,第一次传递参数没用,只有从第二次开始有用.从yield左边接收参数;

function* foo() {
  const num = yield foo1(1);
  const num1 = yield foo1(num);
  const num2 = yield foo1(num1);
}

function foo1(num) {
  return num*2;
}

const gen = foo();
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next(2)); // num = 2, { value: 4, false }
console.log(gen.next(4)); // num1 = 4, { value: 8, false }
console.log(gen.next()); // { value: undefine, true }

标签:console,log,await,value,async,foo,gen,初始,const
From: https://www.cnblogs.com/taosifan/p/16865955.html

相关文章

  • 012 Rust 异步编程,在 async 块中使用?
    在Rust异步编程中能否像在同步编程中一样使用问号呢?我们来试试。示例源码[dependencies]futures="0.3"配置文件usefutures;asyncfnfoo()->Result<(),String>{"f......
  • 001.项目初始化,生成逆向文件
    1.整合Mybatis1.1在pom.xml中添加文件<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-......
  • C++构造函数初始化列表注意的坑
    原文链接:https://www.zhoubotong.site/post/87.html之所以写这篇文章,是觉得里面有些细节如果不注意,很容易出错或踩坑,网上有很多教程对这块的描述部分存在错误。希望下面......
  • 使用nvm配置nodejs,已经nodejs使用的初始化步骤
    <-----------------------------------------nvm是什么------------------------------------------------->nvm:进行node版本切换管理手动配置nvm,需要进入地址https://gi......
  • JavaSE—变量的作用域和初始化
    一、变量的作用域变量被定义为只在某个程序块内或只在方法体内部有效,这种类型的变量通常被称为“局部变量”。局部变量的作用范围有效,只在相应的方法体或程序块内有效,超出......
  • 使用emplace_back的new initializer expression list treated as compound expression
    测试代码使用emplace_back可以避免不必要的构造和拷贝,而是直接在向量的内存位置执行construct进行构造,代码看起来也更加简洁。但是在使用的时候,会发现有一些和直观不太对......
  • Vue 2.x源码学习:应用初始化大致流程
    我们使用vue-cli搭建vue2.x项目时,大致由如下代码来做一个vue应用的初始化:importVuefrom"vue";importAppfrom"./App.vue";Vue.config.productionTip=false;n......
  • spring security 01 初始入门
    1.引入<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</versio......
  • 如何判断Javascript函数是否是Async函数
     zhangfisher发布于 2021-04-13判断Javascript函数是否是Async函数有好几种方法:调用Object.prototype.toString.call(asyncfunction(){}),如果返回[objectAsy......
  • 协程的async使用
    async与launch一样都是开启一个协程,但是async会返回一个Deferred对象,该Deferred也是一个job async函数类似于launch函数.它启动了一个单独的协程,这是一个轻量级的线程......