Using promises

  过去,异步方法这样写:

  1. function successCallback(result) {
  2. console.log("It succeeded with " + result);
  3. }
  4.  
  5. function failureCallback(error) {
  6. console.log("It failed with " + error);
  7. }
  8.  
  9. doSomething(successCallback, failureCallback);

  使用promise后,异步方法这样写:

  1. let promise = doSomething();
  2. promise.then(successCallback, failureCallback);

  promise模式有以下几个好处:

  1、回调方法永远在下一帧后才会调用。即使当前帧已完成。

  2、可以通过串连.then,设置多个回调。

  promise模式可以用于解决死亡金字塔问题:

  1. doSomething(function(result) {
  2. doSomethingElse(result, function(newResult) {
  3. doThirdThing(newResult, function(finalResult) {
  4. console.log('Got the final result: ' + finalResult);
  5. }, failureCallback);
  6. }, failureCallback);
  7. }, failureCallback);
  1. doSomething().then(function(result) {
  2. return doSomethingElse(result);
  3. })
  4. .then(function(newResult) {
  5. return doThirdThing(newResult);
  6. })
  7. .then(function(finalResult) {
  8. console.log('Got the final result: ' + finalResult);
  9. })
  10. .catch(failureCallback);

  catch(failureCallback) 是 then(null, failureCallback) 的简单写法

  使用new Promise((resolve, reject)=>{})创建 Promise。Basically, the promise constructor takes an executor function that lets us resolve or reject a promise manually

  1. const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
  2.  
  3. wait(10000).then(() => saySomething("10 seconds")).catch(failureCallback);
  1. new Promise((resolve, reject) => {
  2. console.log('Initial');
  3.  
  4. resolve();
  5. })
  6. .then(() => {
  7. throw new Error('Something failed');
  8.  
  9. console.log('Do this');
  10. })
  11. .catch(() => {
  12. console.log('Do that');
  13. })
  14. .then(() => {
  15. console.log('Do this whatever happened before');
  16. });

  Promise.resolve() and Promise.reject() are shortcuts to manually create an already resolved or rejected promise respectively

  以下两段代码均为reduce应用。用于串于执行异步或同步调用。

  1. [func1, func2].reduce((p, f) => p.then(f), Promise.resolve());
  1. Promise.resolve().then(func1).then(func2);

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

Using promises的更多相关文章

  1. Christmas Trees, Promises和Event Emitters

    今天有同事问我下面这段代码是什么意思: var MyClass = function() { events.EventEmitter.call(this); // 这行是什么意思? }; util.i ...

  2. JavaScript中Promises/A+规范的实现

    Promises是一种异步编程模型,通过一组API来规范化异步操作,这样也能够让异步操作的流程控制更加容易. 下面的代码是假设执行一个异步队列,每一项都会使用上一项返回的数据: function ne ...

  3. CommonJS Promises/A规范

    本文来自四火哥的翻译 CommonJS是一组javascript编程规范,而promise是其中之一. 简而言之,promises是一种令代码的异步行为变得更加优雅的软件抽象.在基本的定义中,代码可能 ...

  4. We have a problem with promises

    原文地址:http://fex.baidu.com/blog/2015/07/we-have-a-problem-with-promises/ 用Javascript的小伙伴们,是时候承认了,关于 p ...

  5. Jasmine测试ng Promises - Provide and Spy

    jasmine提供了很多些很实用的处理Promises的方法,首先我们来考虑下面的这个例子: angular.module("myApp.store").controller(&q ...

  6. 异步编程之Javascript Promises 规范介绍

    什么是 Promises Promises是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口. 传统的回调函数 说到JavaScript的异步编程处理,通常我们 ...

  7. JS魔法堂:剖析源码理解Promises/A规范

    一.前言 Promises/A是由CommonJS组织制定的异步模式编程规范,有不少库已根据该规范及后来经改进的Promises/A+规范提供了实现 如Q, Bluebird, when, rsvp. ...

  8. node.js下when.js(Promises/A)的实践

    假设一个业务场景: 通过rss地址,获取rss并保存于文件,rss地址保存于文件中. 完成该场景的业务需要完成3个任务: 1.从文件中读取rss地址. 2.获取rss. 3.保存于文件. 最后将这三个 ...

  9. 使用 Promises 编写更优雅的 JavaScript 代码

    你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它 ...

  10. Scala 并行和并发编程-Futures 和 Promises【翻译】

    官网地址 本文内容 简介 Futures 阻塞 异常 Promises 工具 最近看了<七周七语言:理解多种编程泛型>,介绍了七种语言(四种编程范型)的主要特性:基本语法,集合,并行/并发 ...

随机推荐

  1. rsyncd

    rsync是一个快速.通用的文件复制工具.支持两种工作模式:基于shell的传输.基于服务的传输.1.配置文件 rsyncd.conf文件由模块及其参数构成.模块由方括号包裹模块名称,直到下一个模块结 ...

  2. C# Microsoft.Office.Interop.Excel.ApplicationClass 加载类型库/DLL 时出错

    问题  无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Intero ...

  3. 《算法》第五章部分程序 part 5

    ▶ 书中第五章部分程序,包括在加上自己补充的代码,Knuth-Morris-Pratt 无回溯匹配,Boyer - Moore 无回溯匹配,Rabin - Karp 指纹匹配 ● Knuth-Morr ...

  4. django之ForNode是如何渲染的

    django的模板编译后变成一般text.tag.varible,然后根据上下文进行渲染. class ForNode(Node):    child_nodelists = ('nodelist_l ...

  5. Nginx 设置负载均衡

    1. 在nginx配置文件目录下另外单独创建一个文件用于管理负载均衡配置,这里起名为 fzjh.conf vim /etc/nginx/fzjh.conf #在文件下添加以下内容 upstream m ...

  6. PC浏览器播放m3u8

    HLS(HTTP Live Streaming)是苹果公司针对iPhone.iPod.iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方案.在 HLS 技术中 Web 服务器向客户 ...

  7. [uwsgi: command not found]

    问题: pip install uwsgi 之后,运行uwsgi 报错:[uwsgi: command not found] 解决方案:建立软链接 ln -s /usr/local/python3/b ...

  8. Mysql索引,有哪几种索引,什么时候该(不该)建索引;SQL怎么进行优化以及SQL关键字的执行顺序

    索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 1.按照索引列值的唯一性,索引可分为唯一索引和非唯一索引 非唯一索引:B树索引 crea ...

  9. linux配置sphinx

    1. 配置索引 cd /usr/local/sphinx/etc/ cp sphinx.conf.dist sphinx.conf //备份配置文件,防止改错 vim sphinx.conf 配置文件 ...

  10. day38-常见第三方模块

    1.requests模块 2.psutil模块 3.xlrd模块 4.xlwt模块 5.Paramiko模块