异步回调

在异步编程中,我们一般都是使用回调函数,我们将一个函数传递给一个异步函数,当任务完成时它将调用这个函数。

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相关推荐

  1. 2021年大数据Kafka(九):kafka消息存储及查询机制原理

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 kafka消息存储及查询机制原理 一.Kafka数据存储机制 ...

  2. 2021年大数据HBase(九):Apache Phoenix的安装

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 前言 系列历史文章 安装Phoenix 一.下载 二.安装 1.上传安装包 ...

  3. 2021年大数据Hive(九):Hive的数据压缩

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive的数据压缩 一.MR支持的压缩编码 二.压缩配置 ...

  4. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

  5. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...

  6. 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器

    第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 原文: 第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来 ...

  7. autoware中lgsvl Simulator安装与使用:LGsvl Simulator 2021.2.1版(九)

    autoware安装与使用:LGsvl Simulator 2021.2.1版(windows10)(九) 介绍如何在windows下安装LGsvl Simulator 2021.2.1版 环境:wi ...

  8. bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示

    1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...

  9. 浅说——九讲背包之01背包

    所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...

最新文章

  1. Asp.Net Core AsyncLocal 异步上下文
  2. 谷歌发布 RLDS,在强化学习生成、共享和使用数据集
  3. mybatis 复习笔记02
  4. Spark笔记:复杂RDD的API的理解(下)
  5. git push的时候报411问题
  6. 基于python的聊天室_Python实现文字聊天室
  7. Android之提示can‘t execute: Permission denied解决办法
  8. 公众号发布代码最好的工具markdown语法
  9. 【VS2015】链接器错误link2001
  10. 51nod-1351:吃点心
  11. 5分钟商学院-个人篇-高效能人士的思维习惯
  12. Vim插件管理插件Vim-plug
  13. 【原创】PC微信逆向分析の强制输出微信调式信息
  14. Python游戏开发,pygame模块,Python实现记忆翻牌小游戏
  15. 如何彻底删除HbuilderX
  16. Java中日期格式化字符串大小写区别YYYY和yyyy
  17. 英雄算法联盟 - 六月集训排行榜 (截止今日第31天)
  18. Data Structures in C++:八大基本数据结构概述
  19. 滴滴23届校招薪资正式开奖!算法岗最高 55w
  20. C#实现域账号密码登录

热门文章

  1. Swift调用微信支付宝SDK(Swift4.0)
  2. 第一天学习笔记之数组(冒泡排序+二分查找)
  3. cxVerticalGrid赋值是实时更新
  4. [bzoj4763]雪辉[bzoj4812][Ynoi2017]由乃打扑克
  5. 【分享】学长的安利来了~~O(∩_∩)O
  6. Betsy Ross Problem
  7. caffe学习日记--Lesson2:再看caffe的安装和使用、学习过程
  8. 数据结构笔记(六)-- 双向链表
  9. mac os x 10.11 php7,mac osx 10.11.2安装PHP7提示“configure: error: libcrypto not found!”
  10. 银行考试计算机重点知识,银行计算机考试试题