博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
promise和async/await的异步调用方法
阅读量:5815 次
发布时间:2019-06-18

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

  promise和async/await都是异步方案,promise是es6的新特性,而async/await是es7新出的特性。

  想必大家对promise有所见过,他是一个对象,可以实现链式的写法来实现同步异步操作,一般我们可以这样写:

var pro = new promise (function(resolve,reject){   resolve()})

同时他有三种状态:pending(进行中),resolved(已完成),rejected(已失败);如上面代码所示,resolve里面表示完成后的操作,reject表示失败够所要执行的代码。但同时我们也可以通过简易的代码来表示,如:

var somePromise = function(){    return Promise.resolve('bar');  }

当我们第一个promise对象执行完后执行下一个promise时,我们可以通过链式写法:then()...catch()...,then表示上一个promise执行完后执行,如果出现错误就会在catch里面显示:

var newPromise = function(){    return Promise.resolve('foo').then(somePromise).then(function(result){      console.log("111",result);    }).catch(function(err){console.log("err",err)});  }  var somePromise = function(){    return Promise.resolve('bar');  }  newPromise();

then方法的出现可以帮助我们实现闭包的问题,因为他是在promise执行完后执行:

function timeout(ms) {      return new Promise((resolve, reject) => {        setTimeout(resolve, ms, 'done');      });    }        timeout(100).then((value) => {      console.log(value);    });

  此外,then()是期望获得一个函数,如果是非函数形式的就会显示then(null);

而对于async/await来说是基于promise的,他可以让我们更加优雅的写出代码,而替代then()的写法,例如:

const f = () => {  return new Promise((resolve, reject) => {    setTimeout(() => {      reject(234);    }, 2000);  });};const testAsync = async () => {  try {    const t = await f();    console.log(t);  } catch (err) {    console.log(err);  }};testAsync();

  在上述代码中,同样实现了代码的先后滞留执行问题;需要注意的是await必须写在async的作用域内;如果promise函数里是reject,那就会在catch里面执行代码;在上述代码中,我们是在async里面先执行promisr代码,然后再执行下面的代码,所以我们也可以用他来很好的执行for循环的逐一显示问题。

  一段话解释就是:await后面等待的是一个结果,不仅仅可以等待一个promise对象,也可以是返回值;async函数是返回的是一个promise对象,一般是在async里return返回值,如果没有返回值,它会返回 Promise.resolve(undefined),但也不会阻塞后面的语句执行;await后面的值可以是async返回的promise,也可以是简单的function函数,它需要包含在async函数内;并且通过try{}catch{}来解决promise.reject()报错的问题。

promise和async/await都是实现异步的好方法,虽然现在还有兼容性的问题,但我们可以使用babel来转换es6和es7。

  

转载于:https://www.cnblogs.com/abey/p/7054527.html

你可能感兴趣的文章
LNMP一键安装
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
Http、TCP/IP协议与Socket之间的区别(转载)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
vrpie在Visio Studio 中无法调试的问题
查看>>
第六课:数据库的基本工具
查看>>
关于二叉树重构的思索
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>
系统版本判断
查看>>
My97DatePicker 日历插件
查看>>
0603 学术诚信与职业道德
查看>>
小点心家族第3位成员——楼层定位效果
查看>>
Knockout.Js官网学习(enable绑定、disable绑定)
查看>>
hive基本操作与应用
查看>>