一.Promise—Promise似乎是ES6中的规范

  1. PROMISE的语言标准,PROMISE/A+规范,如何使用,在什么场景下使用
  2. PromiseJS对异步操作场景提出的解决方案(回调,观察者模式等等都是一些方案)
  3. Promise以同步的方式写代码,执行异步的操作,Promise对象和普通JS对象没什么区别,它有三种状态1:未完成2:已完成3:失败
  4. A+规范和A的不同点
  5. -A+规范通过thenable来区分promise对象
  6. -A+定义onFulfilled/onRejected必需是作为一个函数来调用,并且调用过程要是异步的
  7. -A+严格定义了then方法链式调用时onFulfilled/onRejected的调用顺序

JS动画settimeout,setinterval,requestAnimationFrame

npm install bluebird (blue时一个promise库)

npm install 在哪个目录写包就会安装在哪个目录(全局估计不是)

  1. Promise then方法
  2. promiseObj.then(onFullfilled,onRejected)
  3. 返回的必需是一个promise对象
  1.  Javascript的特点是异步,Javascript不能等待,如果你实现某件需要等待的事情,你不能停在那里一直等待结果回来,相反,底线是使用回调callback:你定义一个函数,这个函数只有等到结果可用时才能被调用。
  2.  
  3.  这种回调模型对于好的代码组织是没有问题的,但是也可以通过从原始回调切换到promise解决很多问题,将promise看成是一个标准的数据容器,这样会简化你的代码组织,可以成为基于promise的架构。
  4.  
  5. 什么是Promise?
  6.  
  7.  一个promise是一个带有".then()"方法的对象,其代表的是一个操作的结果可能还没有或不知道,无论谁访问这个对象,都能够使用".then()"方法加入回调等待操作出现成功结果或失败时的提醒通知,。
  8.  
  9.  那么为什么这样做好处优于回调呢?标准的回调模式在我们处理请求时需要同时提供回调函数:
  10.  
  11. request(url, function(error, response) {
  12. // handle success or error.
  13. });
  14. doSomethingElse();
  15.  很不幸,这段代码意味着这个request函数并不知道它自己什么时候能够完成,当然也没有必要,我们最终通过回调传递结果。这会导致多个回调形成了嵌套回调,或者称为回调陷阱。
  16.  
  17. queryTheDatabase(query, function(error, result) {
  18. request(url, function(error, response) {
  19. doSomethingElse(response, function(error, result) {
  20. doAnotherThing(result, function(error, result) {
  21. request(anotherUrl, function(error, response) {
  22. ...
  23. });
  24. });
  25. });
  26. });
  27. });
  28.  Promise能够解决这种问题,允许低层代码创建一个request然后返回一个对象,其代表着未完成的操作,让调用者去决定应该加入什么回调。
  29.  
  30. Promise是什么?
  31.  
  32.  promise是一个异步编程的抽象,它是一个返回值或抛出exception的代理对象,一般promise对象都有一个then方法,这个then方法是我们如何获得返回值(成功实现承诺的结果值,称为fulfillment)或抛出exception(拒绝承诺的理由,称为rejection),then是用两个可选的回调作为参数,我们可以称为onFulfilledOnRejected
  33.  
  34. var promise = doSomethingAync()
  35. promise.then(onFulfilled, onRejected)
  36.  
  37.  当这个promise被解决了,也就是异步过程完成后,onFulfilledOnRejected中任何一个将被调用,
  38.  
  39.  因此,一个promise有下面三个不同状态:
  40.  
  41. pending待承诺 - promise初始状态
  42. fulfilled实现承诺 - 一个承诺成功实现状态
  43. rejected拒绝承诺 - 一个承诺失败的状态
  44.  以读取文件为案例,下面是使用回调实现读取文件后应该做什么事情(输出打印):
  45.  
  46. readFile(function (err, data) {
  47. if (err) return console.error(err)
  48. console.log(data)
  49. })
  50.  如果我们的readFile函数返回一个promise,那么我们可以如下实现同样的逻辑(输出打印):
  51.  
  52. var promise = readFile()
  53. promise.then(console.log, console.error)
  54.  
  55.  这里我们有了一个值promise代表的是异步操作,我们能够一直传递这个值promise,任何人访问这个值都能够使用then来消费使用它,无论这个值代表的异步操作是否完成或没有完成,我们也能保证异步的结果不会改变,因为这个promise代表的异步操作只会执行一次,状态是要么fulfilled要么是rejected
  56.  
  57. 理解Promise
  58.  
  59.  Promise可能是不同于日常直觉,为了理解它,一些重要原理必须记牢: .then()总是返回一个新的promise.,如下面代码:
  60.  
  61. var promise = readFile()
  62. var promise2 = promise.then(readAnotherFile, console.error)
  63.  
  64.  这里then的参数readAnotherFile, console.error是代表异步操作成功后的动作onFulfilled或失败后的动作OnRejected,也就是说,读取文件成功后执行readAnotherFile函数,否则失败打印记录错误。这种实现是两个中只有一种可能。
  65.  
  66.  我们再看下面上述代码如下:
  67.  
  68. var promise = readFile()
  69. var promise2 = promise.then(function (data) {
  70. return readAnotherFile() // 如果readFile成功,执行readAnotherFile
  71. }, function (err) {
  72. console.error(err) // 如果readFile不成功,记录,但是还是执行readAnotherFile
  73. return readAnotherFile()
  74. })
  75. promise2.then(console.log, console.error) // readAnotherFile函数的执行结果
  76.  因为then返回一个promise,它意味着promise能够被chain串行链条花,这样能避免回调地狱:
  77.  
  78. readFile()
  79. .then(readAnotherFile)
  80. .then(doSomethingElse)
  81. .then(...)
  82.  Promise法则有两部分必须分离:
  83.  
  84.  1).then()总是返回一个新的promise,每次你调用它,它不管回调做什么,因为.then()在回调被调用之前已经给了你一个承诺promise,回调的行为只影响承诺promise的实施,如果回调返回一个值,那么promise将使用那个值,如果这个值是一个promise,返回这个promise实施后的值给这个值,如果回调抛出错误,promise将拒绝错误。
  85.  
  86.  2)被.then()返回的promise是一个新的promise,它不同于那些.then()被调用的promisepromise长长的链条有时会好些隐藏这个事实,不管如何,每次.then()调用都会产生一个新的promise,这里必须注意的是你真正需要考虑的是你最后调用.then()可能代表失败,那么如果你不捕获这种失败,那么容易导致你的错误exception消失。
  87.  
  88.  一些人认为.then()串联链条调用很类似fluent风格,但是长长的promise链条会让人迷惑,最后切分为一个个有意义的函数:
  89.  
  90. function getTasks() {
  91. return $http.get('http://example.com/api/v1/tasks')
  92. .then(function(response) {
  93. return response.data;
  94. });
  95. }
  96.  
  97. function getMyTasks() {
  98. return getTasks()
  99. .then(function(tasks) {
  100. return filterTasks(tasks, {
  101. owner: user.username
  102. });
  103. });
  104. }
  105.  在这个例子中,两个函数各自获得一个promise,携带了一个回调函数。
  106.  
  107. 有趣的Promise
  108.  
  109.  同样的promise能够接受任何数目的回调,当一个Promise被解决实施后,其中所有回调函数都会被调用,此外,一个promise在被解决实施后,甚至可以接受一个新的回调,这些回调完成能以正常方式被调用,这就允许我们使用回调实现简单形式的缓存:
  110.  
  111. var tasksPromise;
  112. function getTasks() {
  113. taskPromise = taskPromise || getTasksFromTheServer();
  114. return taskPromise;
  115. }
  116.  这个案例中,getTasks()函数可以被任意次数调用,它总是返回铜牙的promise,其中函数getTasksFromTheServer()却只是被调用一次。

进击Node.js基础(二)promise的更多相关文章

  1. 进击Node.js基础(二)

    一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...

  2. 10慕课网《进击Node.js基础(一)》初识promise

    首先用最简单的方式实现一个动画效果 <!doctype> <html> <head> <title>Promise animation</titl ...

  3. 07慕课网《进击Node.js基础(一)》HTTP小爬虫

    获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...

  4. 03慕课网《进击Node.js基础(一)》API-URL网址解析

    url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...

  5. 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子

    版本:偶数位为稳定版本,基数为非稳定版本 - 0.6.x - 0.7.x    - 0.8.x -0.9.x    -0.10.x  -0.11.x 概念:Node.js采用谷歌浏览器的V8引擎,用C ...

  6. 进击Node.js基础(一)

    一.前言 1:Node.js本质上是用chrome浏览器 v8引擎 使用c++编写的JS运行环境 2:相比于JS没有浏览器安全级的限制,额外提供了一些系统级的API:文件读写,进程管理,网络通信等. ...

  7. 02慕课网《进击Node.js基础(一)》——CommonJs标准

    是一套规范管理模块 每个js 为一个模块,多个模块作为一个包 node.js和Couchdb是对其的实现: 不同于jQuery 模块:定义.标识.引用(地址/模块名称) 模块类型: 核心模块http ...

  8. node.js 基础二 开启服务器监听

    1.server.js 2.监听 一 server.js 二 监听 运行server.js后,浏览器打开:http://localhost:8888/ //====================== ...

  9. 05慕课网《进击Node.js基础(一)》HTTP概念进阶(同步/异步)

    HTTP模块介绍 支持http协议的更多特性 不缓存请求和响应 API比较底层处理流相关,信息解析 HTTP相关概念 回调 将函数作为参数传到执行函数中,参数函数在执行函数中嵌套执行 function ...

随机推荐

  1. Android Data Binding代码实践(告别findViewById)(四)

    Data Binding实战(一) Data Binding语法解析(二) Data Binding高级用法(三) 好了,继前三篇学习了Data Binding之后,我们可以发现它的强大之处有这么几点 ...

  2. 关于getchar函数缓冲区的问题

    最近,看到有同学问我关于getchar()这个函数缓冲区的问题,结合我以前的学习,我将对getchar()进行一次总结,当然,这些都是别人已经提过的东西,我只是总结,接下来我们来看看. 首先,用get ...

  3. 关于masm中PTR伪指令的一点思考

    在masm中,PTR伪指令只能修饰内存变量类型,因为任何寄存器的大小都是已知的且不能改变的(如果PTR修饰的是寄存器,则它修饰的是寄存器本身而不是其指向的内容)所以不能用PTR改变寄存器的大小,例如: ...

  4. Qt5中this application has requested the runtime to terminate it in an unusual way 无法运行问题的解决

    在windows平台使用Qt5.8mingw版写出的程序,在Qt中运行正常,而以release的形式编译并且补充完必要的dll文件后,在其他电脑上运行出现了以下问题: 经过查阅许多资料和亲身实验,终于 ...

  5. 解决Visual Studio 2017隐藏“高级保存选项”命令

    Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符.在Visual Studio 2017中,该命令没有默认显示在“文件”菜单中.用户需要手工设置,才能 ...

  6. Linux下安装MQ

    1.下载Linux下MQ的安装包,网上下载试用版或购买正版,此处以7.0.0.0版为例安装 2.如上图所示,是linux的MQ安装包展开图 3.创建用户和用户组 >root用户连接linux & ...

  7. Supervisor安装、配置、开启启动

    1.安装Python包管理工具(easy_install) wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py -O - ...

  8. ## 分享一下Mac(苹果电脑)里面好用的软件!

    该文章主要分享 Mac电脑常用的软件 文章来源于 github小弟调调™的仓库转载 说明 [Open-Source Software][OSS Icon] 表示 开源软件 ,点击进入 开源 仓库: ...

  9. IT咨询顾问:一次吐血的项目救火

    年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登录,对方技术人员一头雾水不知道什么原因 ...

  10. Eclipse配置SpringBoot

    从这一博客开始学习SpringBoot,今天学习Eclipse配置SpringBoot.Eclipse导入SpringBoot有两种方式,一种是在线一个是离线方式. 一.在线安装 点击Eclipse中 ...