翻译:JavaScript Promises and AngularJS $q Service

原文:http://www.webdeveasy.com/javascript-promises-and-angularjs-q-service/

原文时间:2014年9月30号

一个promise(延缓)是处理异步开发简单而强大的方法。CommonJS 维基百科列出了几个promise模式的实施提议。AngularJS自己的promise实现方法是受kris Kowal‘s Q的方法启发的。在这篇文章中我会介绍promises,它的目的和怎么通过AngularJS $q的promise服务开发的教程。



Promise(延缓)目的

在JavaScript中,异步方法通常通过调用回调方法来实现成功或失败的处理。比如说浏览器的地理位置api,获取地理坐标时就需要成功或者失败的回调方法。

function success(position) {
  var coords = position.coords;
  console.log(‘Your current position is ‘ + coords.latitude + ‘ X ‘ + coords.longitude);
}

function error(err) {
  console.warn(‘ERROR(‘ + err.code + ‘): ‘ + err.message);
}

navigator.geolocation.getCurrentPosition(success, error);

另一个例子就是xhr请求(ajax请求),它有一个onreadystatechange回调方法,当readyState改变时就会调用它。

var xhr = new window.XMLHttpRequest();
xhr.open(‘GET‘, ‘http://www.webdeveasy.com‘, true);
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            console.log(‘Success‘);
        }
    }
};
xhr.send();

Javascript中还有许多其他的异步例子,下面讨论麻烦的多个异步方法运行。

串行(无尽金字塔)

假设现在又N种异步方法需要串行运行:async1(success, failure)async2(success, failure), …, asyncN(success, failure),一个接一个直到成功,每个方法都有成功和失败的回调,那么代码就是这样:

async1(function() {
    async2(function() {
        async3(function() {
            async4(function() {
                ....
                    ....
                        ....
                           asyncN(null, null);
                        ....
                    ....
                ....
            }, null);
        }, null);
    }, null);
}, null); 

这就是著名的回调金字塔(callback pyramid of doom)。虽然还有更好的写法(把回调流分隔成函数),但是这种方式还是很难读懂和维护。

并行

假设我们有N个异步方法,async1(success, failure)async2(success, failure), …, asyncN(success, failure) ,我们需要让他们并行运行,再在最后弹出一个消息。每个方法都有成功和失败的回调,那么代码就是这样:

var counter = N;

function success() {
    counter --;
    if (counter === 0) {
        alert(‘done!‘);
    }
}

async1(success);
async2(success);
....
....
asyncN(success);

我们声明了一个变量counter,让它的值为N,每当一个方法成功了,就减一,然后检测是否为零,也就是是否执行到最后一个了。这种方法使用起来既麻烦又不利于维护,特别是当每个异步方法还有参数要传到success()方法里的时候,那样我们还要保存每次运行的结果。

在上面两个例子里,在一个异步操作过程中,我们必须要指定成功的回调。也就是说,当我们用回调时,异步操作的继续需要一个引用,但是它的下一步操作也许是与自己无关的。这就导致了很难重复使用和测试的紧密耦合模块和服务。

时间: 2024-10-10 22:04:39

翻译:JavaScript Promises and AngularJS $q Service的相关文章

转:JavaScript Promises相当酷:一种有趣的方案库

许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures.JavaScript的promises ,可以促进关注点分离,以代替紧密耦合的接口. 本文讲的是基于Promises/A 标准的JavaScript promises.[http://wiki.commonjs.org/wiki/Promises/A]Promise的用例: 执行规则 多个远程验证 超时处理 远程数据请求 动画 将事件逻辑从应用逻辑中解耦

初始JavaScript Promises之二

初始JavaScript Promises之二 上一篇我们初步学习了JavaScript Promises,本篇将介绍Promise如何优雅地进行错误处理以及提升操作node.js风格1的异步方法的逼格,没错就是使用promisify2. 异步编程中的错误处理 人性的.理想的也正如很多编程语言中已经实现的错误处理方式应该是这样: try {     var val = JSON.parse(fs.readFileSync("file.json")); }catch(SyntaxErro

初识JavaScript Promises

JavaScript有很多槽点,嵌套回调怕是千夫所指. 很久之前,我一直使用async来处理JavaScript异步编程中的嵌套回调问题.当然我也大概的了解过一些其它旨在解决这些问题的类库,诸如EventProxy.Jscex.StepJS.thenjs. 当我第一次看到Promises规范的时候,我根本无法理解它所带来的好处.譬如每个初次学习Promises的人都见过如下的示例代码: //callbacks function callback(err, value){ if(err){ //

Javascript Promises

Javascript Promises 2018-11-05 THUDM team Eunbi Choi Syntax new Promise( /* executor */ function(resolve, reject) { ... } ); executor: A function that is passed with the arguments resolve and reject. The executor function is executed immediately by t

【翻译】ExtJS vs AngularJS

原文:ExtJS vs AngularJS ExtJS和AngularJS是两个行业内率先的富界面开发框架.TechFerry有机会使用Ext JS和Angular JS来开发多个富界面的单页面应用程序.本文讲述的就是使用这两种技术来开发多个应用程序后的开发体验.本文环绕利弊.架构.測试.移动能力.性能.生成和部署等方面对Ext JS和Angular JS进行了超过30个以上的要点进行了比較. 我们将通过使用Ext JS和Angular JS开发一个測试应用程序来了解架构细节,以便进行具体的性能

[label][翻译][JavaScript Regular Expression]JavaScript Regular Expressions

原文:http://www.javascriptkit.com/javatutors/re.shtml 校验用户的输入是每一个软件开发者的必须要做的事情. 正则表达式与模式 如何在JavaScript中使用正则表达式呢?这里有两种方式: 1)字面量语法. 2)当你需要动态构建正则表达式时,可以通过RegExp()构造函数. 字面量语法如下: var RegularExpression = /pattern/; RegExp()构造函数方法如下: var RegularExpression = n

Javascript Promises 介绍

什么是 Promises Promises是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口. 传统的回调函数 说到JavaScript的异步编程处理,通常我们会想到回调函数,如下面的代码: getFileAsync("1.txt", function(error, result){ if(error){ throw error; } // 取得成功时的处理 }); 上面的代码定义了一个获取文件内容的函数,读取完成后回调用传入的回调函数,对于下面

异步编程之Javascript Promises 规范介绍

什么是 Promises Promises是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口. 传统的回调函数 说到JavaScript的异步编程处理,通常我们会想到回调函数,如下面的代码: getFileAsync("1.txt", function(error, result){      if(error){          throw error;      }     // 取得成功时的处理 }); 上面的代码定义了一个获取文件内容的

【翻译自mos文章】Windows Service Oracleremexecservice 是干什么的

来源于: What Is The Windows Service "Oracleremexecservice" ? (文档 ID 1433144.1) 适用于: Oracle Server - Enterprise Edition - Version 11.2.0.1 and later Oracle Server - Standard Edition - Version 11.2.0.1 and later Microsoft Windows (32-bit) Microsoft W