美文网首页
完美的异步?

完美的异步?

作者: O8 | 来源:发表于2017-03-17 00:31 被阅读0次

ES6添加Promise大大的方便了异步的调用,ES7提出async,await来完善异步。人类就是在这样一步一步的进步!

async

先看看async这个函数:

async function name(argument) {
  statements
}

async函数就是在函数面前用async声明

  • 当async函数在被声明的时候他会返回一个Promise
  • 当async函数返回一个值时,这个值会当成Promise的resolve()的参数
  • 当async函数抛出一个值时候,这个值会当成promise的reject()的参数
async function testAsync() {
  return 'success'
}
const t = testAsync()
t.then((a) => {
  console.log(a)
})
// success

async function testAsync() {
  throw 'fail'
}
const t = testAsync()
t.then((a) => {
  console.log(a)
}, (a) => {
  console.log(a)
})
// fail
  • async函数中有个特殊字符await,await后面若是一个异步函数,则在异步函数完成之后继续执行
 function testSome(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x)
    }, 1000)
  })
}
async function test() {
  let a = await testSome(1)
  console.log(a)
}
test()
// 1

你是否会会考虑

let a = await testSome(1)
console.log(a)

为什么会是1呢?那我们就要说说await

  • await就像等待出征丈夫归来的良人,若是等到它后面函数的返回值,就把返回的值作为await运算的结果。

详情文档

说了这么多这货到底能干些什么呢?

首先要说的是没有他之前我们要这么写promise:

function yieldSome(a) {
  return new Promise((resolve) => {
    setTimeout(() => resolve(a + 1), a)
  }, 1000)
}
function yieldOne(a) {
  console.log(`yieldone: ${a}`)
  return yieldSome(a)
}
function yieldTwo(a) {
  console.log(`yieldTwo: ${a}`)
  return yieldSome(a)
}
function go() {
  console.time('do')
  const one = 1
  yieldOne(one)
    .then(two => yieldTwo(two))
    .then(result => {
      console.log(`result is ${result}`)
      console.timeEnd('end')
    })
}
go()

那现在我们可以这么写:

 async function go() {
    console.time('doIt')
    const time1 = 300
    const time2 = await step1(time1)
    const time3 = await step2(time2)
    const result = await step3(time3)
    console.log(`result is ${result}`)
    console.timeEnd("doIt")
}
go()

-------------------------------------------------------华丽的分割线

相关文章

  • 完美的异步?

    ES6添加Promise大大的方便了异步的调用,ES7提出async,await来完善异步。人类就是在这样一步一步...

  • H5 资源异步加载策略

    1、async & defer 区别async异步加载脚本,加载完立马执行defer异步加载脚本,并在DOMCon...

  • Flutter (十一)异步执行

    异步执行 异步执行做成同步的效果 需要使用async和await关键字 【串行】 多个异步执行完之后再往下走 【...

  • 优美的异步 --- RxAndroid

    优美的异步 --- RxAndroid 这里和大家一起分享一下一个著名的Android异步库RxAndroid。它...

  • 02、NodeJS-基础

    一、异步编程 异步操作 Node大量采用异步操作,即任务不是马上执行,而是直接插入任务队列的尾部,等前面任务执行完...

  • 02、NodeJS-基础

    一、异步编程 异步操作 Node大量采用异步操作,即任务不是马上执行,而是直接插入任务队列的尾部,等前面任务执行完...

  • 小程序里使用async和await变异步为同步,解决回调地狱问题

    最近好多同学,学习完石头哥的云开发基础以后,自己实际项目中,总会遇到各种各样的异步问题。 一,异步问题 所谓异步:...

  • JS

    1、异步和回调 - 异步:不等任务执行完,直接执行下一个任务。 function taskAsync = func...

  • 上传文件 upload file

    使用jQuery.form插件,实现完美的表单异步提交 表单的异步提交,现在不需要 jQuery插件之ajaxFi...

  • 【Flutter 1-13】Flutter手把手教程Dart语言

    异步 Dart 代码库中有大量返回Future或Stream对象的函数,这些函数都是异步的,它们会在耗时操作执行完...

网友评论

      本文标题:完美的异步?

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