链接:https://juejin.im/post/5aa1fce051882555677e21aa

众所周知的,Javascript是一种单线程的语言,所有的代码必须按照所谓的“自上而下”的顺序来执行。本特性带来的问题就是,一些将来的、未知的操作,必须异步实现。本文将讨论一个比较常见的异步解决方案——Promise。

Promise解决的问题

相信每个前端都遇到过这样一个问题,当一个异步任务的执行需要依赖另一个异步任务的结果时,一般会将两个异步任务嵌套起来,这种情况发生一两次还可以,但是发生很多次之后,代码就会变成这个熊样:

async1(function(){async2(function(){async3(function(async4(funciton(){async5(function(){ // 直到地老天荒});});));});});

这就是所谓的回调地狱,代码层层嵌套,环环相扣,很明显,逻辑稍微复杂一些,这样的程序就会变得难以维护。

Promise的基本用法

时至今日,很多现代浏览器都已经实现,但是为了兼容,建议自行对Promise进行封装或者使用第三方的解决方案(如webpack对es6语法进行编译)。得到一个Promise构造函数,新建一个Promise的实例:

var _promise = new Promise(function(resolve, reject){setTimeout(function(){var rand = Math.random();if(rand<0.5){resolve("resolve" + rand);}else{reject("reject" + rand);}},1000);});

由上所示,Promise的构造函数接收一个函数作为参数,该函数接受两个额外的函数,resolve和reject,这两个函数分别代表将当前Promise置为fulfilled(解决)和rejected(拒绝)两个状态。Promise正是通过这两个状态来控制异步操作的结果。接下来我们将讨论Promise的用法,实际上Promise上的实例 _promise是一个对象,不是一个函数。在声明的时候,Promise传递的参数函数会立即执行,因此Promise使用的正确姿势是在其外层再包裹一层函数。

var run = function(){var _promise = new Promise(function(resolve, reject){setTimeout(function(){var rand = Math.random();if(rand<0.5){resolve("resolve" + rand);}else{reject("reject" + rand);}},1000);});return _promise;}run();

这是Promise的正常用法,接下来,就是对异步操作结果的处理,接着上面创建的函数run()

run().then(function(data){console.log(data);});

每个Promise的实例对象,都有一个then的方法,这个方法就是用来处理之前各种异步逻辑的结果。

那么, 这么做有什么用?

当然有用,到目前为止,我们学会了Promise的基本流程,但是这种用法和嵌套回调函数似乎没什么区别,而且增加了复杂度。但是我们说了,Promise的用处,实际上是在于多重异步操作相互依赖的情况下,对于逻辑流程的控制。Promise正是通过对两种状态的控制,以此来解决流程的控制。请看如下代码:

run().then(function(data){//处理resolve的代码cosnole.log("Promise被置为resolve

语言解决猜神童年龄的问题_JavaScript语言基础:Promise是如何解决回调地狱问题的?...相关推荐

  1. 语言解决猜神童年龄的问题_一个程序设计题目猜年龄(不限程序语言)

    题目如下: 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学. 一次,他参加某个重要会议,年轻的脸孔引人注目.于是有人询问他的年龄,他回答 ...

  2. 软件开发基于JavaScript实现快速转换文本语言(繁体中文和简体中文)_javascript技巧

    软件开发基于JavaScript实现快速转换文本语言(繁体中文和简体中文)_javascript技巧 一般商业网站都有一个语言的需求,就是为了照顾使用正体中文的国人,会特地提供一个切换到正体中文的选项 ...

  3. c语言猜数字游戏用while,用C语言实现猜数字游戏

    本文实例为大家分享了C语言实现猜数字的具体代码,供大家参考,具体内容如下 问题:计算机随机生成一个数字,用户进行猜数字,当用户猜错时,提醒用户猜高/猜低,直到用户猜的数字与计算机给的随机数一致时,提示 ...

  4. 【C语言】第一个C语言项目——“猜数字”游戏(内附源码)

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello米娜桑,这里是君兮_,今天又抽空为大家更新我们的主线0基础C语言啦!鉴于最近讲解了非常多的选择语句与循环语句,咱们今天就来讲讲 ...

  5. C语言中猜数大小的实验报告,猜数字游戏实验报告

    <猜数字游戏实验报告>由会员分享,可在线阅读,更多相关<猜数字游戏实验报告(17页珍藏版)>请在人人文库网上搜索. 1.C语言课程设计报告题 目:猜数字游戏班 级:通信工程组 ...

  6. python计算学生平均年龄_CodeSalt | Python解决按学生年龄排序的实际问题

    Python解决按学生年龄排序的实际问题 问题:定义一个Class:包含姓名name.性别gender.年龄age,需要按年龄给学生排序. 输入:包含学生对象的List. 输出:按照年龄age进行排序 ...

  7. R语言读取出现 列的数目比列的名字要多的解决方法

    R语言读取出现 列的数目比列的名字要多的解决方法 参考文章: (1)R语言读取出现 列的数目比列的名字要多的解决方法 (2)https://www.cnblogs.com/cyh1989/p/9112 ...

  8. php rpc连接Python,PHP语言之Python、PHP通过xml-rpc进行通信,xml-rpc中文的解决

    本文主要向大家介绍了PHP语言之Python.PHP通过xml-rpc进行通信,xml-rpc中文的解决,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 可以通过XML-RPC让不同平台 ...

  9. c语言程序设计 猜数字,C语言程序设计(猜数字游戏)报告.doc

    C语言程序设计(猜数字游戏)报告 <高级语言程序设计>课程设计 题目:班级:09R3 学生姓名:谢泽雄 学生学号:200931000622 指导老师:提交时间:华南农业大学信息(软件)学院 ...

最新文章

  1. 扫盲文章:AMF,RTMP,RTMPT,RTMPS
  2. spark任务shell运行_《Spark快速大数据分析》- 根据简单例子理解RDD
  3. 模板:BSGS(数论)
  4. 有钱可以多任性?OpenAI提出人肉模型训练,文本摘要全面超越人类表现!
  5. Linux 零拷贝方案
  6. 计算机考研补录,考研补录是什么意思 需要考试吗
  7. 【互联网周刊】2022年第6期摘录
  8. verilog 中if....else语句以及case语句详细理解
  9. mysql 全文所有_MySQL中的全文搜索
  10. 课程设计之学生选课管理系统
  11. L7805CV-ASEMI三端稳压管L7805CV
  12. python pygame实现简单的网游 1
  13. matlab里方框一个叉号,Word输入×叉号和方框打叉方法
  14. 三种LCA算法(一):Doubly算法(倍增算法)
  15. python海龟库函数大全_python海龟库的使用
  16. COIL:结合稠密检索和词汇匹配的更高效检索模型
  17. 巧用位运算实现大小写转换
  18. 線上 Android/Linux Kernel Source Code瀏覽 - Android/Linux Source Code Cross Reference
  19. 怎么制作公司网页教程【网站制作】
  20. ML code | KNN python实现

热门文章

  1. Ardino基础教程 23_步进电机
  2. 类和对象—友元—全局函数做友元
  3. 点滴篇(一) 第一篇 博客
  4. 基于CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征MATLAB源码
  5. 考前自学系列·计算机组成原理·查询方式/中断方式/DMA方式的适用范围及判断
  6. 《MVC 系列》- 控制器数据传递
  7. linux中生成考核用的FAT32文件系统结构样例(一)
  8. 《C++入门经典(第6版)》——1.3 创建您的第一个程序
  9. openstack之neutron linuxbridge + vlan组网
  10. 普通IO口驱动LCD