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 }

原文地址:http://www.cnblogs.com/taosifan/p/16865955.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性