消费者:then,catch,finally

昨天讲了关于 Promise 的理解,有人在下面评论说要我出关于源码的解析,能力有限只能循序渐进了,我们还是先把基础的搞明白,再逐步深入。

Promise对象充当执行者(“产生代码”或“singer”)和消费函数(“fans”)之间的链接,它们将接收结果或错误。使用.then、.catch和.finally方法可以注册(订阅)消费函数。

then

最重要,最基本的是 then 。

他的的语法是:

promise.then(function(result) { /* handle a successful result */ },function(error) { /* handle an error */ }
);

then的第一个参数是一个函数,它在promise被解析时运行,并接收结果。

then的第二个参数是一个函数,当promise被拒绝时运行,并接收错误。

例如,以下是人们对成功解决的反应:

let promise = new Promise(function(resolve, reject) {setTimeout(() => resolve("done!"), 1000);
});// resolve runs the first function in .then
promise.then(result => alert(result), // shows "done!" after 1 seconderror => alert(error) // doesn't run
);

执行了第一个函数。

在被拒绝的情况下,第二个

let promise = new Promise(function(resolve, reject) {setTimeout(() => reject(new Error("Whoops!")), 1000);
});// reject runs the second function in .then
promise.then(result => alert(result), // doesn't runerror => alert(error) // shows "Error: Whoops!" after 1 second
);

如果我们只对成功完成感兴趣,那么我们只能为.then提供一个函数参数:

let promise = new Promise(resolve => {setTimeout(() => resolve("done!"), 1000);
});promise.then(alert); // shows "done!" after 1 second

catch

如果我们只对错误感兴趣,那么可以使用null作为第一个参数:.then(null, errorHandlingFunction)。或者我们可以使用.catch(errorHandlingFunction),两者完全相同:

let promise = new Promise((resolve, reject) => {setTimeout(() => reject(new Error("Whoops!")), 1000);
});// .catch(f) is the same as promise.then(null, f)
promise.catch(alert); // shows "Error: Whoops!" after 1 second

调用.catch(f)完全是对.then(null, f)的模拟,它只是一个简写。

finally

就像在一个普通的try{…} catch{…}终于有了承诺。

调用.finally(f)类似于.then(f, f),因为f总是在promise被解决时运行:无论是resolve还是reject。

finally是一个很好的处理程序,用于执行清理,例如停止我们的加载指示器,因为它们不再需要了,无论结果是什么。

是这样的:

new Promise((resolve, reject) => {/* do something that takes time, and then call resolve/reject */
})// runs when the promise is settled, doesn't matter successfully or not.finally(() => stop loading indicator)// so the loading indicator is always stopped before we process the result/error.then(result => show result, err => show error)

也就是说,finally(f)并不是then(f,f)的别名。有一些细微的区别:

finally处理程序没有参数。在最后,我们不知道诺言是否成功。没关系,因为我们的任务通常是执行“一般的”收尾过程。

finally处理程序将结果和错误传递给下一个处理程序。

例如,这里的结果被传递给finally:

new Promise((resolve, reject) => {setTimeout(() => resolve("result"), 2000)
}).finally(() => alert("Promise ready")).then(result => alert(result)); // <-- .then handles the result

在promise中有一个错误,最后传递给catch:

new Promise((resolve, reject) => {throw new Error("error");
}).finally(() => alert("Promise ready")).catch(err => alert(err));  // <-- .catch handles the error object

例子:loadScript

我们在前一章中使用了loadScript函数来加载脚本。

下面是基于回调的变体,只是为了提醒我们:

function loadScript(src, callback) {let script = document.createElement('script');script.src = src;script.onload = () => callback(null, script);script.onerror = () => callback(new Error(`Script load error for ${src}`));document.head.append(script);
}

我们用 Promise 重写一下。

新的函数loadScript不需要回调。相反,它将创建并返回一个Promise对象,该对象将在加载完成时解析。外部代码可以使用.then向其添加处理程序(订阅函数):

function loadScript(src) {return new Promise(function(resolve, reject) {let script = document.createElement('script');script.src = src;script.onload = () => resolve(script);script.onerror = () => reject(new Error(`Script load error for ${src}`));document.head.append(script);});
}

用法

let promise = loadScript("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js");promise.then(script => alert(`${script.src} is loaded!`),error => alert(`Error: ${error.message}`)
);promise.then(script => alert('Another handler...'));

消费者怎么看待 then, catch, finally相关推荐

  1. 一个简单的生产消费者示例

    前言:打算回顾一下以前学过的知识点,先以一个小程序开始吧 下面的代码是中午刚写的,传统的synchronized.while.wait.notifyAll的示例就不写了 1 package com.m ...

  2. java的知识点34——线程通信 || 生产者与消费者问题

    线程通信 应用场景:生产者和消费者问题 • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待, ...

  3. java多线程生产者与消费者案例_多线程操作实例——生产者与消费者

    面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者- ...

  4. Java中的生产消费者问题

    1 package day190109; 2 3 import java.util.LinkedList; 4 import java.util.Queue; 5 import java.util.R ...

  5. 生产者消费者模型【新版】

    目录 啥是生产者消费者模型? 生产者消费者模型存在问题??如何进行解决呢?? 生产者消费者模型导致的问题 什么是阻塞队列 生产者消费者模型优点 生产者消费者模型实现 Message MessageQu ...

  6. 多线程之生产者消费者模型

    生产者消费者模型 1.为什么要使用生产者和消费者模式 2.案例 1.为什么要使用生产者和消费者模式 在线程开发中,生产者就是生产线程的线程,消费者就是消费线程的线程.在多线程开发中,如果生产者如理数据 ...

  7. 多线程——生产者消费者模型

    写一个固定容量同步容器,拥有put和get方法,以及getCount方法,能够支持2个生产者线程以及10个消费者线程的阻塞调用. 1.synchronized同步方法 public class Con ...

  8. Java多线程技术~生产者和消费者问题

    Java多线程技术~生产者和消费者问题 本文是上一篇文章的后续,详情点击该连接 线程通信 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取 ...

  9. ES6 --- Promise深入学习(二)Promise,then,catch,finally,及使用示例

    Promise 想象一下,你是一位顶尖歌手,粉丝没日没夜地询问你下首歌什么时候发. 为了从中解放,你承诺(promise)会在单曲发布的第一时间发给他们.你给了粉丝们一个列表.他们可以在上面填写他们的 ...

最新文章

  1. Codeforces Round #649 (Div. 2)C. Ehab and Prefix MEXs[排列的构造]
  2. JAVA中的Font
  3. 【数据结构与算法】之深入解析“股票的最大利润”的求解思路与算法示例
  4. UIView的属性使用
  5. 【渝粤教育】国家开放大学2018年秋季 0554-21T立体构成(一) 参考试题
  6. 十二赞日志收集与报警系统一览
  7. AD PCB板子长度宽度 PCB板子尺寸大小信息
  8. 软件安装管家软件目录
  9. React 可视化开发工具 shadow-widget 最佳实践(上)
  10. vue的npm run dev做了什么
  11. 计算机录制视频的方法,怎么录制电脑屏幕视频步骤(电脑录屏的方法有4种)...
  12. mysql frm myd myi 恢复_通过*.frm,*.myd,*.myi文件恢复mysql数据库
  13. 山东省大学生软件设计大赛一等奖作品参赛视频
  14. 计算机语言栏无法设置,win10系统修改语言栏设置的解决方案
  15. 霍纳法则c语言算法代码,霍纳法则(Horner Rule)介绍及C语言实现
  16. 网页POST之文件上传专项视频教程
  17. Access to XMLHttpRequest at ‘http://localhost:4000/detail/getRealImg‘ from origin ‘http://127.0.0.1:
  18. Python将小写字母转化为大写字母
  19. EventBus 最简易的使用方式
  20. 如何快速绘制XRD标准图

热门文章

  1. 智能网联云控平台在园区自动驾驶的场景应用
  2. 八门神器java版本_【修改教程】java基础知识字符串处理_八门神器
  3. JQuery实现网页图片懒加载
  4. 安卓开发文档!花三分钟看完这篇文章你就懂了!帮你突破瓶颈
  5. matlab 双纵坐标图的绘制
  6. 约瑟夫问题与魔术(九)——魔术《五重巧合之皇家同花顺》
  7. clean_code总结
  8. 神经退行性疾病的新希望
  9. 6-1 水仙花数判断 (10分)(函数题)
  10. android studio打jar包并添加三方包