Promise是一个非常有价值的构造器,能够帮助你避免使用镶套匿名方法,而使用更具有可读性的方式组装异步代码。这里我们将介绍6个最简单的特性。
在我们开始正式介绍之前,我们想看看Javascript Promise的样子:
var p = new Promise(function(resolve, reject) { resolve("hello world"); }); p.then(function(str) { alert(str); });
运行结果:弹出hello world。
一. then()返回一个Forked Promise
以下两段代码有什么区别呢?
// Exhibit A var p = new Promise(/*...*/); p.then(func1); p.then(func2); // Exhibit B var p = new Promise(/*...*/); p.then(func1) .then(func2);
如果你认真以上两段代码等同的话,那么Promises只不过是一个一维的回调函数数组。然而,其实不是这样的。每一个then()调用都返回一个forked promise。因此,ExhibitA中,如果func1()抛出一个异常,func2()仍旧正常调用。在ExhibitB中,如果func1()抛出一个错误,fun2()将不会被调用,因为第一个调用返回了一个新的promise,这个在func1()中会被拒绝,结果是func2()被跳过。
总结:promises可以被fork成多个路径,类似复杂的流程图。
二. Callback应该传递结果
var p = new Promise(function(resolve, reject) { resolve("hello world"); }); p.then(function(str) {}) .then(function(str) { alert(str); });
上面运行结果是弹出一个提示框,内容为undefined。这是因为回调函数,在promise的上下文中,因为结果的变化并没有回调函数。promise期望你的回调函数返回同样的结果或者返回一个替换结果,然后被传递到下一个回调函数中。类似使用adpater来变化结果,如下:
var feetToMetres = function(ft) { return ft*12*0.0254 }; var p = new Promise(function(resolve, reject) { resolve(100); }); p.then(feetToMetres) .then(function(metres) { alert(metres); });
运行结果:弹出含有30.48的弹出框。
三.只有来自上一层的异常可以被捕捉
这两段代码有什么区别?
// Exhibit A new Promise(function(resolve, reject) { resolve("hello world"); }) .then( function(str) { throw new Error("uh oh"); }, undefined ) .then( undefined, function(error) { alert(error); } ); // Exhibit B new Promise(function(resolve, reject) { resolve("hello world"); }) .then( function(str) { throw new Error("uh oh"); }, function(error) { alert(error); } );
在第一段代码中,在第一个then()中的异常被抛出,将会被第二个then()捕捉,然后“uh oh”警告将会被触发,这个遵循只有前一个层次的异常会被捕捉。
在第二段代码中,回调函数和错误回调函数是同一个层次,意味着当异常在回调中抛出,将不会被捕捉。事实上,第二段代码的错误回调将只会在promise为拒绝状态或者promise本身出错的情况下抛出。
四. 错误可以被恢复
在一个错误回调函数中,如果你不重新抛出错误,promise会假设你已经从错误中恢复,并且反转成为已解决状态。如下例子中,"i'm saved" 将会被显示,这是因为在第一个then()中的错误回调没有重新抛出异常。
var p = new Promise(function(resolve, reject) { reject(new Error("pebkac")); }); p.then( undefined, function(error) { } ) .then( function(str) { alert("I am saved!"); }, function(error) { alert("Bad computer!"); } );
Promise可以被看作洋葱上的层次。每一个then()添加另外一个层次到洋葱上。每一个层次代表了一个被处理的活动。当层次结束,结果被认为已经修复并且为下一个层次做好了准备。
五. Promises可以被暂停
因为你已经准备好了在一个then()方法中执行,并不意味着你不能够暂停并且提前运行其他。 为了暂停目前的promise,或者让它等待以便另外一个promise完成,简单在then()中返回另外一个promise。
var p = new Promise(/*...*/); p.then(function(str) { if(!loggedIn) { return new Promise(/*...*/); } }) .then(function(str) { alert("Done."); })
在前面代码中,直到新的promise解析后提示才会出现。这是一个方便的方式在已存在的异步代码路径中来引入更多地依赖。
例如,你可能发现用户session已经timeout,并且你可能希望在继续前面的代码路径前初始化第二个登陆。
var p = new Promise(function(resolve,reject){resolve(loggedIn = false);}); p.then(function(str) { if(!loggedIn) { return new Promise(function(resolve,reject){resolve(console.log('bijian'))}); } }) .then(function(str) { alert("Done."); })
6. Resolved Promises并不会立刻执行
运行下面代码会得到提示框么?
function runme() { var i = 0; new Promise(function(resolve) { resolve(); }) .then(function() { i += 2; }); alert(i); } runme();
因为promise被立刻解析,然后then()方法被立刻执行,所以你可能会认为会弹出提示2。但是promise定义要求所有的调用都被强制异步。因此提示会在被修改前生成,所以实际弹出提示0。
文章来源:http://www.jb51.net/article/48680.htm
相关推荐
### JavaScript异步编程的Promise模式 #### 引言 随着Web技术的发展,特别是Web 2.0技术的应用,用户对网站交互性和响应速度的要求越来越高。在这种背景下,异步编程成为了现代Web开发中不可或缺的一部分。然而,...
3. **JavaScript异步编程**: 异步编程是JavaScript的重要特性,用于处理耗时操作,如网络请求和文件读写,以避免阻塞主线程。主要方法有: - 回调函数:最基础的异步处理方式,但可能导致回调地狱问题。 - 事件...
综上所述,《JavaScript异步编程》这本书详细介绍了JavaScript中异步编程的各种技术和最佳实践,包括但不限于回调函数、事件循环、Promise、async/await等核心概念和技术。通过学习本书,读者可以更好地理解和掌握...
本文主要介绍了JavaScript异步编程设计的相关内容,为了构建快速响应的网络应用,文章深入探讨了异步编程的多种方法,并提供了实用的实践案例。异步编程是Web开发中的一个重要概念,它允许程序在等待耗时操作(如I/O...
### JavaScript异步编程知识点 #### 一、异步编程基础概念 - **定义**:异步编程是指在程序运行过程中,某段代码不阻塞主线程执行其他任务的能力。这在处理耗时操作如网络请求、文件读写时尤为重要。 - **同步与...
### JavaScript异步编程指南——终极解决方案Async/Await #### 引言 随着现代Web应用程序对交互性和实时性的需求增加,JavaScript作为主流的前端开发语言之一,其异步编程能力变得至关重要。自ECMAScript 2017(即...
javascript异步编程是处理Web前端和Node.js后端中耗时任务的常见技术。由于JavaScript语言的单线程特性,它无法并行处理多个任务,因此通过异步编程可以避免程序长时间阻塞,提高用户体验和服务器性能。 1. 回调...
4. **异步编程**:JavaScript是单线程执行的,因此异步处理(如回调函数、Promise、async/await)对于处理I/O操作和避免阻塞至关重要。 5. **模块系统**:了解CommonJS、AMD和ES6模块,以及如何在Node.js环境中组织...
在Node.js中,异步编程是其核心特性,它利用非阻塞I/O和事件驱动机制来提高性能,避免了多线程带来的复杂性。异步编程的关键挑战包括异常处理、回调地狱、阻塞代码以及多线程编程,这些都需要开发者有清晰的异步编程...
Promise作为JavaScript异步编程的一种重要模式,由jQuery引入并广泛应用于现代JavaScript库和框架中,如jQuery、Dojo等。 Promise,可以译为"承诺",表示一个单一操作的最终完成或失败状态。它有三种基本状态:未...
Promise是一种解决异步编程问题的模式,它代表一个将要完成且不可改变的异步操作的结果。ES6引入了Promise的概念,并且现代浏览器如Chrome和Firefox已经内置实现了Promise对象。Promise有三种状态:pending(等待中...
Promise对象是JavaScript异步编程中解决回调地狱(callback hell)的一种方案。特别是在服务器端JavaScript应用中,异步操作无处不在,Promise可以带来更简洁清晰的异步操作代码。例如,在jQuery中引入了Promise之后...
本文将详细总结六种主要的JavaScript异步编程方法:回调函数、事件监听、发布订阅模式、Promise、Generator(ES6)以及async/await(ES7)。 1. **回调函数**: 回调函数是最基础的异步处理方式,通过将后续操作...
JavaScript中的异步模式是编程中的一个重要概念,尤其是在APICloud这样的平台中,许多API的调用都是异步的。这主要是因为JavaScript的执行环境是单线程的,意味着在同一时间只能执行一个任务。为了处理耗时操作而不...
本文将深入探讨JavaScript异步编程的问题及其优化策略。 首先,我们来关注最常见的一个问题——回调地狱(Callback Hell)。在处理一系列相互依赖的异步操作时,如果每个操作都嵌套在前一个操作的回调函数中,就会...
4. **异步编程(Asynchronous Programming)**:JavaScript是单线程的,但通过事件循环和回调函数、Promise、async/await等机制实现了异步处理,避免了程序阻塞。 5. **ES6及以后的语法特性**:包括箭头函数、类、...