博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Callbacks, Promises and Async/Await
阅读量:5986 次
发布时间:2019-06-20

本文共 3761 字,大约阅读时间需要 12 分钟。

为了简要说明Promise,常见函数设置为胖箭头函数。

function() {}     function(a) {}      function(a,b) {}替代为() => {}          a => {}            (a,b) => {}复制代码

举例说明一个函数,随机打印一个字符串

function printString(string){  setTimeout(    () => {      console.log(string)    },     Math.floor(Math.random() * 100) + 1  )}复制代码
function printAll(){  printString("A")  printString("B")  printString("C")}printAll()复制代码

顺序随机,如果想固定,则用Callbacks

1. CallBacks

function printString(string, callback){  setTimeout(    () => {      console.log(string)      callback()  //callback is a reference    },     Math.floor(Math.random() * 100) + 1  )}复制代码
function printAll(){  printString("A", () => {    printString("B", () => {      printString("C", () => {})    })  })}printAll()复制代码

太多Callback,号称callbackhell

2. Promises

function printString(string){  return new Promise((resolve, reject) => {    setTimeout(      () => {       console.log(string)       resolve()      },      Math.floor(Math.random() * 100) + 1    )  })}复制代码

把整个函数,包闭在promise内,成功后resolve,错误则reject;返回一个promise object

function printAll(){  printString("A")   .then(() => {  //consume promise    return printString("B")  //return promise;可以去掉return  })  .then(() => {  //consume promise    return printString("C")    })}printAll()复制代码

使用胖箭头简化下

function printAll(){  printString("A")  .then(() => printString("B"))  .then(() => printString("C"))}printAll()复制代码

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

第二个例子

function getPromise () {  return new Promise((resolve) => {    setTimeout(resolve, 2000)  })}function logA () {  console.log('A')}function logB () {  console.log('B')}function logCAndThrow () {  console.log('C')  throw new Error()}function catchError () {  console.log('Error!')}getPromise()  .then(logA) // A  .then(logB) // B  .then(logCAndThrow) // C  .catch(catchError) // Error!复制代码

3. Await Async

Await就是promise的语法糖syntactic sugar

function printAll(){  printString("A")  .then(() => printString("B"))  .then(() => printString("C"))}printAll()复制代码
async function printAll(){  //must use async before await to enable await...within the function  await printString("A")    //no need to use then...  await printString("B")  await printString("C")}printAll()复制代码

async必须在await前,因此await必要用在函数内,不能用在全局global 如果用在global则需要如此IIFEE:

(async () => {   await myDate();})();复制代码

继续研究。。。上面的await只是关于顺序问题,没有涉及到数据的传递和返回,如果需要传递和返回怎么办呢?

a.callback

function addString(previous, current, callback){  setTimeout(    () => {      callback((previous + ' ' + current))    },     Math.floor(Math.random() * 100) + 1  )}复制代码
function addAll(){  addString('', 'A', result => {    addString(result, 'B', result => {      addString(result, 'C', result => {       console.log(result) // Prints out " A B C"      })    })  })}addAll()复制代码

b.promise

function addString(previous, current){  return new Promise((resolve, reject) => {    setTimeout(      () => {        resolve(previous + ' ' + current)      },       Math.floor(Math.random() * 100) + 1    )  })}复制代码
function addAll(){    addString('', 'A')  .then(result => {    return addString(result, 'B')  //must return,because we need the resolved value!!!  })  .then(result => {    return addString(result, 'C')  })  .then(result => {    console.log(result) // Prints out " A B C"  })}addAll()复制代码

用胖箭头如下

function addAll(){    addString('', 'A')  .then(result => addString(result, 'B'))  .then(result => addString(result, 'C'))  .then(result => {    console.log(result) // Prints out " A B C"  })}addAll()复制代码

c.await

async function addAll(){  let toPrint = ''  toPrint = await addString(toPrint, 'A')  //相当于promise then  toPrint = await addString(toPrint, 'B')  toPrint = await addString(toPrint, 'C')  console.log(toPrint) // Prints out " A B C"}addAll()复制代码

转载地址:http://apflx.baihongyu.com/

你可能感兴趣的文章
初始化监听端口
查看>>
iOS Version和Build的区别
查看>>
IP数据报、TCP报文、UDP报文格式
查看>>
HDU 2017女生赛04 (变形最短路)
查看>>
POJ 2421 有一条连通下的最小生成树
查看>>
快速上手微信小程序-快递100
查看>>
HDU4374:One hundred layer(dp+单调队列优化)
查看>>
PHP定时器实现每隔几秒运行一次
查看>>
string 大小写转换
查看>>
IsIconic()和OnPaint()函数
查看>>
HDU 5867 Water problem ——(模拟,水题)
查看>>
The dependency `BaiduMapKit` is not used in any concrete target
查看>>
直接打印类,调用toString()方法
查看>>
win10优化开机进程
查看>>
MSTParser的使用---
查看>>
git入门
查看>>
第四十四天
查看>>
第三十天笔记
查看>>
枚举 递归
查看>>
NTT学习笔记
查看>>