`
Coding扣钉
  • 浏览: 3367 次
文章分类
社区版块
存档分类
最新评论

Promise简介

阅读更多

初识 Promise
在上年的年末,我们工作室在学校接了一个项目,当时一小伙伴带起 NodeJS 的学习热潮,于是我们选择用 NodeJS 搭起了我们项目的后端。当时项目里引入了形形色色的模块,令我觉得眼花缭乱(当时我是这么觉得的),其中有一个 Promise 的模块让我最为深刻,当时我们用的是 Promise 的这个 bluebird 实现。

 

什么是 Promise
Promise 是一种让异步代码书写起来更优雅的模式,能够让异步操作代码像同步代码那样书写并且阅读,比如下面这个异步请求的例子:

   

loadImg('a.jpg', function() {
      loadImg('b.jpg', function() {
        loadImg('c.jpg', function() {
          console.log('all done!');
        });
      });
    });

 

使用 Promise 模式可转变为:

   

 var loadImage = new Promise(function(img) {
        loadImg(img);
    });
    loadImage('a.jpg').then(function() {
        return loadImage('b.jpg');
    }).then(function () {
        return loadImage('c.jpg');
    }).then(function () {
        console.log('all done!');
    });

 

简而言之,就是可以把异步形式的代码转变成同步代码形式。摆脱回调地狱。like this↓
曾经有个小偷潜入某神秘机构,偷出机密代码的最后一页,打开一看。

                                       

                                        });
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });
    });

 
一种同步函数与异步函数联系和通信的方式
同步函数最重要的两个特征
 1. 能够返回值
 2. 能够抛出异常

 

这其实和高等数学中的复合函数(function composition)很像:你可以将一个函数的返回值作为参数传递给另一个函数,并且将另一个函数的返回值作为参数再传递给下一个函数……像一条“链”一样无限的这么做下去。更重要的是,如果当中的某一环节出现了异常,这个异常能够被抛出,传递出去直到被 catch 捕获。

 

而在传统的异步操作中不再会有返回值,也不再会抛出异常——或者你可以抛出,但是没有人可以及时捕获。这样的结果导致必须在异步操作的回调中再嵌套一系列的回调,以防止意外情况的发生。

而 Promise 模式恰好就是为这两个缺憾准备的,它能够实现函数的复合与异常的抛出(冒泡直到被捕获)。符合 Promise 模式的函数必须返回一个 promise,无论它是fulfilled 状态也好,还是 failed(rejected) 状态也好,我们都可以把它当做同步操作函数中的一个返回值:

  

  $.get("/user/784533") // promise return
        .then(function parseHandler(info) {
        var userInfo = parseData(JSON.parse(info));
        return resolve(userInfo); // promise return
    })
    .then(getCreditInfo) // promise return
    .then(function successHandler(result) {
       console.log("User credit info: ", result);
    }, function errorHandler(error) {
       console.error("Error:", error);
    })

 这样以来函数复合便一目了然:

   

 try {
        var info = $.get("/user/784533"); //Blocking
        var userInfo = parseData(JSON.parse(info));
    
        var resolveResult = parseData(userInfo);
        var creditInfo = getCreditInfo(resolveResult); //Blocking

        console.log("User credit info: ", result);
    } cacth(e) {
        console.error("Error:", error);
    }

 AngularJS 中的 Promise
前端调用后端 api 的时候有一些场合也需要同步代码实现(比如在某个用户的 profile 加载完成以前,不可以渲染"用户资料")。最近学习AngularJS,所以便介绍 Angular 中的 Promise。

在 Angular 中的 Promise 实现是 $q

   

 function asyncGreet(name) {
      // perform some asynchronous operation, resolve or reject the promise when appropriate.
      return $q(function(resolve, reject) {
        setTimeout(function() {
          if (okToGreet(name)) {
            resolve('Hello, ' + name + '!');
          } else {
            reject('Greeting ' + name + ' is not allowed.');
          }
        }, 1000);
      });
    }

    var promise = asyncGreet('Robin Hood');
    promise.then(function(greeting) {
      alert('Success: ' + greeting);
    }, function(reason) {
      alert('Failed: ' + reason);
    });

 

最后……
鄙人才疏学浅,一点点经验,如有谬误,欢迎指正。

huangruichang

 

 参考阅读

 1. 【翻译】Promises/A+ 规范
 2. Promise/A 的误区以及实践
 3. AngularJS 文档

分享到:
评论

相关推荐

    Promise简介相关

    Promise简介相关

    javascript-promise-book

    ##### **Promise简介** Promise的主要优点包括: - **简洁性**:简化了异步代码的编写。 - **错误处理**:统一的方式处理错误,提高了代码的可读性和可维护性。 - **链式调用**:支持链式调用,使得多个异步操作...

    前端开源库-meteor-promise

    ### 一、ES6 Promise 简介 ES6 Promise 是 JavaScript 中用于处理异步操作的一种机制,它引入了全新的状态管理模型。Promise 有三种状态:pending(等待中)、fulfilled(已成功)和rejected(已失败)。一旦状态从...

    promises-introduction:JS Promise简介和基本实现指南

    #Javascript承诺简介 这是一个简单的回购协议,用于希望了解承诺原因并希望了解自己创建Promise库实现的工程师 随附的Prezi演示文稿可以在找到 ####使用此仓库的初始步骤 npm install安装依赖项 npm install nodemon...

    谈谈jQuery之Deferred源码剖析

    #### 一、Deferred和Promise简介 jQuery的Deferred对象是jQuery在ES6的Promise概念出现之前的一种实现,它允许开发者将异步操作的结果通过链式调用的方式处理,避免了传统的层层嵌套的回调函数的写法,让代码的...

    thats-a-promise:JavaScript 中的异步模式

    Promise简介 Promise代表一个未来可能完成或失败的操作的结果,它可以有三种状态:pending(等待中)、fulfilled(已完成)和rejected(已失败)。Promise的创建通过`new Promise`实现,传入一个执行器函数,该函数...

    JavaScript基础练习_day13

    #### 八、Promise简介 - **Promise**:是一种异步编程解决方案,用于替代传统的回调函数,简化异步流程控制。 - **状态**:Promise 对象有三种状态:`pending`(进行中)、`fulfilled`(已成功)和 `rejected`(已...

    promise, 承诺/一个PHP的实现.zip

    promise, 承诺/一个PHP的实现 承诺的轻量级实现:PHP/A 。 主分支包含即将发布的3.0版本的代码。 对于当前稳定的2.x 版本的代码,请检查 2.x 分支代码。目录简介概念延迟承诺。API插件延迟Deferred::pro

    Async/Await替代Promise的6个理由

    Async/Await 简介 对于从未听说过 async/await 的朋友,下面是简介: async/await 是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await 是基于 Promise 实现的,它不能用于普通的回调函数。 ...

    js代码-Promise.prototype.finally用法简介

    Promise.prototype.finally方法是Promise对象的一个扩展,它允许我们在Promise链的末尾添加一个回调函数,无论Promise链的结果是成功还是失败,这个回调函数都会被执行。这个方法在确保某些清理工作(如关闭数据库...

    简介一种数字监控时代PROMISE安全大容量存储方案

     云存储及数据中心解决方案 – 针对云服务业者及企业数据中心,PROMISE提供了高效能、高可用性及高性价比的存储解决方案。VTrak S3000产品提供了数据中心多种数据服务,例如远程灾难备援、精简存储配置、快照等功能...

    如何利用ES6进行Promise封装总结

    简介 promise是异步编程的一种解决方案,比传统的解决方案–回调函数和事件–更合理和强大。 promise简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从语法上来说,Promise是...

    c2p:把普通callback回调转化为Promise

    转化回调函数成简介把转化callback回调方式为Promise方式预转化nodejs内置的, , , 及 部分方法抄, 没有什么新意, 只是喜欢自己的写法而已除了mz之外, 另提供转换函数直接使用使用方法转换方法var callback2Promise =...

    js代码-Promise

    `README.txt`文件通常用来记录项目简介、使用方法、注意事项等信息,对于Promise的介绍可能包括如何在项目中引入和使用Promise,以及解决回调地狱问题的示例。 总之,Promise是JavaScript中处理异步操作的关键工具...

    使用Promise解决多层异步调用的简单学习心得

    【Promise和异步调用简介】 Promise是JavaScript中用于处理异步操作的一种机制,它引入了新的编程模式,使得复杂的异步代码变得简洁且易于理解。在传统的回调函数模式下,多层异步调用会导致回调地狱,代码可读性和...

    js代码-Promise实现

    通常,README文件会包含项目简介、如何运行、依赖项等信息。对于Promise的实现,可能解释了代码的主要功能、使用方法或者测试用例。 总的来说,Promise是JavaScript中处理异步操作的重要工具,通过它可以更优雅地...

    angularjs-FlightDashboard, 带有 AngularJS $q 演示,源代码,&教程的Promise链.zip

    angularjs-FlightDashboard, 带有 AngularJS $q 演示,源代码,&教程的Promise链 简介承诺是解决异步请求和响应复杂性的一个很好的解决方案。 AngularJS使用 $q 和 $http 等服务提供承诺;其他服务也使用承诺,但我...

    mustache-promise

    mustache-promise##简介库原生不支持从文件读取模板,这在某些时候操作起来就会有诸多不便,遂将mustache特别包装了一下,以方便使用##Install From NPM npm install mustache-promise##用法 //Created By zj on 2015...

Global site tag (gtag.js) - Google Analytics