九、Promises
异步回调
在异步编程中,我们一般都是使用回调函数,我们将一个函数传递给一个异步函数,当任务完成时它将调用这个函数。
function doAsyncTask(cb) {setTimeout(() => {console.log("Async Task Calling Callback");cb();}, 1000);
}doAsyncTask(() => console.log("Callback Called"));
复制代码
以上例子应该非常熟悉了,在开发中经常应用到,doAsyncTask函数在调用异步的时候,就会调用我们的cb 函数,这种就是回调函数,cb其实是个简写,因为叫做callback,所有一般都这样写
Promise API
在es6中,给我们带来了个回调的替代方案promise,其实这个promise在es5的时候就有很多第三方的实现库,最早的时候,在jq就有类似的实现了;
它的功能与回调函数相同,但语法更好,更容易处理错误
创建一个Promise对象
我们通过调用promise类的new来创建一个promise的实例
var promise = new Promise((resolve, reject) => {
});
复制代码
我们传递给Promise一个内置函数,并且它接受两个内置参数(resolve, reject),我们可以定义了这个函数,里面的两个参数可以随便我们叫什么,但是我们一般通过语义化的叫法,一般都叫做resolve和reject
==resolve和reject其实也是函数体的一部分==
在这个函数中调用异步函数,我们就可以调用resolve(),如下:
var promise = new Promise((resolve, reject) => {setTimeout(() => {console.log("Async Work Complete");resolve();}, 1000);
});
复制代码
一般我们返回这个promise实例在一个函数中,如下:
function doAsyncTask() {var promise = new Promise((resolve, reject) => {setTimeout(() => {console.log("Async Work Complete");resolve();}, 1000);});return promise;
}
复制代码
如果函数中有报错,将执行reject(),以下代码未完善,error只是表示个意思
function doAsyncTask() {var promise = new Promise((resolve, reject) => {setTimeout(() => {console.log("Async Work Complete");if (error) {reject();} else {resolve();}}, 1000);});return promise;
}
复制代码
我们可以将一个成功的函数附加到then函数中处理,比如:
doAsyncTask().then(() => console.log("Task Complete!"));
复制代码
then 函数中可以带两个参数,第一个以上代码所示,是成功的回调,而还有一个参数是失败的回调函数,可以写成以下方式:
doAsyncTask().then(() => console.log("Task Complete!"),() => console.log("Task Errored!"),
);
复制代码
传递给resolve和reject函数的任何值都会传递给成功和错误处理程序
let error = true;
function doAsyncTask() {return new Promise((resolve, reject) => {setTimeout(() => {if (error) {reject('error'); // pass values} else {resolve('done'); // pass values}}, 1000);});
}doAsyncTask().then((val) => console.log(val),(err) => console.error(err)
);
复制代码
挂载到Promise的resolve和reject
我们可以使用Promise.resolve()方法,直接声明成功回调的方法
let promise = Promise.resolve('done');
复制代码
同样的也有Promise.reject()方法
let promise = Promise.reject('fail');
复制代码
接着也可以和正常声明一样,使用then方法执行回调
let promise = Promise.resolve('done');
promise.then((val) => console.log(val)); // 'done'
复制代码
链式调用
我们可以用then链接做链式调用,因为promise对象每执行完都会返回一个promise对象
Promise.resolve("done").then((val) => {console.log(val);return 'done2';},(err) => console.error(err)).then((val) => console.log(val),(err) => console.error(err));
// 'done'
// 'done2'
复制代码
Promise的错误将会在链式中传递,所以我们不需要在每个then中处理错误,只需要在最后一个中调用reject就可以
Promise.reject('fail').then((val) => console.log(val)).then((val) => console.log(val),(err) => console.error(err));
复制代码
如果在成功的回调中有报错,那么promise对象将会捕获错误在reject中
Promise.resolve('done').then((val) => {throw new Error("fail")}).then((val) => console.log(val),(err) => console.error(err));
// [Error: fail]
复制代码
catch捕获异常
catch函数是用来捕获异常的函数,这样可以更清晰明确的描述错误
Promise.resolve('done').then((val) => {throw new Error("fail")}).then((val) => console.log(val)).catch((err) => console.error(err));
复制代码
总结
Promise能更清晰优雅的写异步回调的代码,捕获异常方面的代码也更加的清晰集中
转载于:https://juejin.im/post/5b40dc4c6fb9a04fbe12be3d
九、Promises相关推荐
- 2021年大数据Kafka(九):kafka消息存储及查询机制原理
全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 kafka消息存储及查询机制原理 一.Kafka数据存储机制 ...
- 2021年大数据HBase(九):Apache Phoenix的安装
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 前言 系列历史文章 安装Phoenix 一.下载 二.安装 1.上传安装包 ...
- 2021年大数据Hive(九):Hive的数据压缩
全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive的数据压缩 一.MR支持的压缩编码 二.压缩配置 ...
- 2021年大数据Hadoop(二十九):关于YARN常用参数设置
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...
- python第二十九课——文件读写(复制文件)
自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...
- 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器
第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 原文: 第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来 ...
- autoware中lgsvl Simulator安装与使用:LGsvl Simulator 2021.2.1版(九)
autoware安装与使用:LGsvl Simulator 2021.2.1版(windows10)(九) 介绍如何在windows下安装LGsvl Simulator 2021.2.1版 环境:wi ...
- bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示
1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...
- 浅说——九讲背包之01背包
所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...
最新文章
- Asp.Net Core AsyncLocal 异步上下文
- 谷歌发布 RLDS,在强化学习生成、共享和使用数据集
- mybatis 复习笔记02
- Spark笔记:复杂RDD的API的理解(下)
- git push的时候报411问题
- 基于python的聊天室_Python实现文字聊天室
- Android之提示can‘t execute: Permission denied解决办法
- 公众号发布代码最好的工具markdown语法
- 【VS2015】链接器错误link2001
- 51nod-1351:吃点心
- 5分钟商学院-个人篇-高效能人士的思维习惯
- Vim插件管理插件Vim-plug
- 【原创】PC微信逆向分析の强制输出微信调式信息
- Python游戏开发,pygame模块,Python实现记忆翻牌小游戏
- 如何彻底删除HbuilderX
- Java中日期格式化字符串大小写区别YYYY和yyyy
- 英雄算法联盟 - 六月集训排行榜 (截止今日第31天)
- Data Structures in C++:八大基本数据结构概述
- 滴滴23届校招薪资正式开奖!算法岗最高 55w
- C#实现域账号密码登录
热门文章
- Swift调用微信支付宝SDK(Swift4.0)
- 第一天学习笔记之数组(冒泡排序+二分查找)
- cxVerticalGrid赋值是实时更新
- [bzoj4763]雪辉[bzoj4812][Ynoi2017]由乃打扑克
- 【分享】学长的安利来了~~O(∩_∩)O
- Betsy Ross Problem
- caffe学习日记--Lesson2:再看caffe的安装和使用、学习过程
- 数据结构笔记(六)-- 双向链表
- mac os x 10.11 php7,mac osx 10.11.2安装PHP7提示“configure: error: libcrypto not found!”
- 银行考试计算机重点知识,银行计算机考试试题