Promise,ES6中定义的规范,不会使用Promise,都不敢说自己用过ES6,大部分介绍Promise的规范的文章对于新手小白来说看得云里雾里,且并不是通俗易懂。本文通过实例介绍讲述Promise中then的的最通俗应用理解,代码建立在不出现异常的情况的操作下,不严谨之处,请以官方规范为标准。

先看一下下面4个Promise到底有什么区别呢?

func().then(function () {

return cb();

});

func().then(function () {

cb();

});

func().then(cb());

func().then(cb);

如果你知道答案,以下内容你可以不用继续。

上面的代码过于简单,运行时话需要稍微进行一点扩展,每个方法中都打印出promise上一步的调用值,为了方便我给每个方法加了一个下标输出,分别是1、2、3、4。

let func = function() {

return new Promise((resolve, reject) => {

resolve('返回值');

});

};

let cb = function() {

return '新的值';

}

func().then(function () {

return cb();

}).then(resp => {

console.warn(resp);

console.warn('1 =========

});

func().then(function () {

cb();

}).then(resp => {

console.warn(resp);

console.warn('2 =========

});

func().then(cb()).then(resp => {

console.warn(resp);

console.warn('3 =========

});

func().then(cb).then(resp => {

console.warn(resp);

console.warn('4 =========

});

不卖关子,直接看结果

首先要明白Promise中then方法会干什么事情!

官方文档是这样定义的:

一个 promise 必须提供一个 then 方法以访问其当前值、终值和据因。

promise 的 then 方法接受两个参数:

promise.then(onFulfilled, onRejected) Todo:这里只介绍onFulfilled,所以删除了关于onRejected的规范定义

onFulfilled 和 onRejected 都是可选参数。

如果 onFulfilled 不是函数,其必须被忽略

如果 onFulfilled 是函数:

当 promise 执行结束后其必须被调用,其第一个参数为 promise 的终值

在 promise 执行结束前其不可被调用

其调用次数不可超过一次

用通(ren)俗(hua)的话来说:

then方法提供一个供自定义的回调函数,若传入非函数,则会忽略当前then方法。

回调函数中会把上一个then中返回的值当做参数值供当前then方法调用。

then方法执行完毕后需要返回一个新的值给下一个then调用(没有返回值默认使用undefined)。

每个then只可能使用前一个then的返回值。

直观的图:

有了上面的定义我们带着三个疑问来回答问题:

上一个then中传入了回调函数吗?

上一个then中提供了返回值吗?

若上一个then中若提供了返回值,返回了什么?

执行第一个方法:

func().then(function () {

return cb();

}).then(resp => {

console.warn(resp);

console.warn('1 =========

});

function () {

return cb();

}

显而易见,是传入了回调函数的

回调函数中把cb执行后的返回值当做then中的返回值,所以输出了“新的值”;

执行第二个方法:

func().then(function () {

cb();

}).then(resp => {

console.warn(resp);

console.warn('2 =========

});

function () {

cb();

}

then回调方法,只是执行了cb方法,并没有return值,定义中讲过若then没有返回值,提供给下一个then使用的参数就是undefined,所以打印出来的是undefined;

执行第三个方法:

func().then(cb()).then(resp => {

console.warn(resp);

console.warn('3 =========

});

func().then(cb())

then中cb()执行后返回的并不是一个函数,在Promise规范中会自动忽略调当前then,所以会把func中的返回值供下一个then使用,输出了“返回值”

执行第四个方法:

func().then(cb).then(resp => {

console.warn(resp);

console.warn('4 =========

});

func().then(cb)

第一个方法在回调内部返回cb执行后的值,第四个方法则直接把cb当做回调,第一个方法与第四个方法异曲同工之妙,所以也输出了“新的值”。

then在c语言中什么意思,通俗浅显的理解Promise中的then相关推荐

  1. 通俗浅显的理解promise中的then

    通俗浅显的理解promise中的then 先看一下下面4个Promise到底有什么区别呢? 执行第一个方法: 执行第二个方法: 执行第三个方法: 执行第四个方法: 文章原文出处:博主petruslaw ...

  2. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  3. php中的控制器是什么意思,理解PHP中的MVC编程之控制器_php

    简单来讲,控制器的作用就是接受请求.它使用获取的方法,在这里是通过URI,载入一个功能模块来刷新或者提交一个表述层.控制器将使用$_GET自动全局变量来判断载入哪一个模块. 一个请求的例子,看起来像这 ...

  4. python中args1是什么意思_理解Python中的*,*args

    1.*在函数调用中的作用 首先定义一个函数,并调用 deffun(a, b, c):printa, b, c fun(1,2,3) 则该函数的输出为 1 2 3 传递3个参数调用该函数,则该函数会打印 ...

  5. ios开发中计算代码运算时间_理解Unity中的优化(二):内存

    内存: 内存消耗是一个关键的性能指标,尤其是在内存资源有限的平台上,比如低端移动设备. 内存消耗分析: 在Unity中诊断内存问题,Unity介绍了一款开元的可视化内存分析工具--MemoryProf ...

  6. python中args是什么意思_理解Python中的*,*args

    1.*在函数调用中的作用 首先定义一个函数,并调用 deffun(a, b, c):printa, b, c fun(1,2,3) 则该函数的输出为 1 2 3 传递3个参数调用该函数,则该函数会打印 ...

  7. java中view是什么_深入理解Android中View

    文章目录 [隐藏] 这回我们是深入到View内部,去研究View,去了解View的工作,抛弃其他因素,以便为以后能灵活的使用自定义空间打下一定的基础.希望有志同道合的朋友一起来探讨,深入Android ...

  8. mysql中having的意思_正确理解MySQL中的where和having的区别

    展开全部 1.where和having都可以使用的32313133353236313431303231363533e4b893e5b19e31333363383964场景select goods_pr ...

  9. python中e什么意思_如何理解Python中 =是什么意思?怎么用?

    这个运算符还是学习python最基础内容时候最先了解的,今天小编在运行代码时候,在这个位置踩了坑,大家一起来看看吧~ 前言: 今天在运行之前写的一个Python脚本时,发生了一个奇怪的现象(我怎么老遇 ...

  10. 【阅读笔记】机器阅读理解(中)——架构篇

    文章目录 一.MRC模型架构 总体架构 编码层 词表向量 字符编码 上下文编码 交互层 互注意力 自注意力 上下文编码 输出层 多项式选择答案生成 区间式答案 自由式答案生成 注意力机制的应用 拷贝生 ...

最新文章

  1. SAE上传web应用(包括使用数据库)教程详解及问题解惑
  2. LeetCode Pascal's Triangle II
  3. 使用select和insert的小细节
  4. 让思考成为一种习惯:一位软件工程专业学生的大学生涯规划
  5. 浙江省团校计算机考试试题及答案,2001年秋浙江省高校计算机等级考试试卷(二级C)及答案..doc...
  6. css背景图根据屏幕大小自动缩放
  7. @override报错_C++ 多态性:C++11:override 与 final(学习笔记:第8章 09)
  8. python之美_Python之美[从菜鸟到高手]--生成器之全景分析
  9. jenkins学习笔记2-在centos中安装jenkins master测试环境
  10. vue的一点初级理解
  11. 程序开发基础学习五(json配置、解析文件,c++篇)
  12. Android开发中加载Gif动画图片方法
  13. 联想E430c:To interrupt normal starup,press enter问题解决方法
  14. java替换图片文字_Java 替换PPT文档中的文本和图片
  15. 这个简笔画很值得学,哄小孩必备
  16. 第三方登陆-------android整理知识
  17. 在线考试题库型App
  18. 【华为OD机试/笔试真题 python】出错的或电路
  19. 51单片机驱动ESP8266
  20. 【读论文-笔记】——2.沐神读Resnet

热门文章

  1. Ardupilot笔记:Rover auto模式下的执行流程
  2. iPhone显示返回的是html界面,iPhone X怎么回到主界面?苹果X返回主页的两种方法...
  3. 如何将电脑上的音乐导入iphone,怎样将电脑音乐导入苹果手机中
  4. echarts-横坐标文字竖着显示和倾斜45度显示
  5. 博尔顿大学介绍让学生们在9月重返校园的创新措施
  6. 【实习日报】2019年6月上半月 前端开发实习工作日报汇总
  7. 【OpenCV】-重映射
  8. 阴阳日历转换 公历日期转农历 八字排日柱算法
  9. 数据模型的作用和数据模型的三个要素:
  10. 永洪科技怎么样_【永洪科技工资|永洪科技待遇怎么样】-看准网