`

JavaScript异步编程Promise模式的6个特性

阅读更多

        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模式

    ### JavaScript异步编程的Promise模式 #### 引言 随着Web技术的发展,特别是Web 2.0技术的应用,用户对网站交互性和响应速度的要求越来越高。在这种背景下,异步编程成为了现代Web开发中不可或缺的一部分。然而,...

    JavaScript设计模式+JavaScript模式+JavaScript异步编程

    3. **JavaScript异步编程**: 异步编程是JavaScript的重要特性,用于处理耗时操作,如网络请求和文件读写,以避免阻塞主线程。主要方法有: - 回调函数:最基础的异步处理方式,但可能导致回调地狱问题。 - 事件...

    《JavaScript异步编程》PDF版本下载.txt

    综上所述,《JavaScript异步编程》这本书详细介绍了JavaScript中异步编程的各种技术和最佳实践,包括但不限于回调函数、事件循环、Promise、async/await等核心概念和技术。通过学习本书,读者可以更好地理解和掌握...

    JavaScript 异步编程设计快速响应的网络应用

    本文主要介绍了JavaScript异步编程设计的相关内容,为了构建快速响应的网络应用,文章深入探讨了异步编程的多种方法,并提供了实用的实践案例。异步编程是Web开发中的一个重要概念,它允许程序在等待耗时操作(如I/O...

    从回调函数到 AsyncAwait:JavaScript 异步编程进阶指南.pdf

    ### JavaScript异步编程知识点 #### 一、异步编程基础概念 - **定义**:异步编程是指在程序运行过程中,某段代码不阻塞主线程执行其他任务的能力。这在处理耗时操作如网络请求、文件读写时尤为重要。 - **同步与...

    JavaScript异步编程指南-终极解决方案Async-Await.docx

    ### JavaScript异步编程指南——终极解决方案Async/Await #### 引言 随着现代Web应用程序对交互性和实时性的需求增加,JavaScript作为主流的前端开发语言之一,其异步编程能力变得至关重要。自ECMAScript 2017(即...

    javascript异步编程的4种方法

    javascript异步编程是处理Web前端和Node.js后端中耗时任务的常见技术。由于JavaScript语言的单线程特性,它无法并行处理多个任务,因此通过异步编程可以避免程序长时间阻塞,提高用户体验和服务器性能。 1. 回调...

    JavaScript高级编程 pdf

    4. **异步编程**:JavaScript是单线程执行的,因此异步处理(如回调函数、Promise、async/await)对于处理I/O操作和避免阻塞至关重要。 5. **模块系统**:了解CommonJS、AMD和ES6模块,以及如何在Node.js环境中组织...

    《深入浅出Node.js》:Node异步编程解决方案之事件发布-订阅模式.docx

    在Node.js中,异步编程是其核心特性,它利用非阻塞I/O和事件驱动机制来提高性能,避免了多线程带来的复杂性。异步编程的关键挑战包括异常处理、回调地狱、阻塞代码以及多线程编程,这些都需要开发者有清晰的异步编程...

    详解JavaScript异步编程中jQuery的promise对象的作用

    Promise作为JavaScript异步编程的一种重要模式,由jQuery引入并广泛应用于现代JavaScript库和框架中,如jQuery、Dojo等。 Promise,可以译为"承诺",表示一个单一操作的最终完成或失败状态。它有三种基本状态:未...

    详谈nodejs异步编程

    Promise是一种解决异步编程问题的模式,它代表一个将要完成且不可改变的异步操作的结果。ES6引入了Promise的概念,并且现代浏览器如Chrome和Firefox已经内置实现了Promise对象。Promise有三种状态:pending(等待中...

    详谈javascript异步编程

    Promise对象是JavaScript异步编程中解决回调地狱(callback hell)的一种方案。特别是在服务器端JavaScript应用中,异步操作无处不在,Promise可以带来更简洁清晰的异步操作代码。例如,在jQuery中引入了Promise之后...

    javascript异步编程的六种方式总结

    本文将详细总结六种主要的JavaScript异步编程方法:回调函数、事件监听、发布订阅模式、Promise、Generator(ES6)以及async/await(ES7)。 1. **回调函数**: 回调函数是最基础的异步处理方式,通过将后续操作...

    JavaScript 中的异步模式【APICloud教程】

    JavaScript中的异步模式是编程中的一个重要概念,尤其是在APICloud这样的平台中,许多API的调用都是异步的。这主要是因为JavaScript的执行环境是单线程的,意味着在同一时间只能执行一个任务。为了处理耗时操作而不...

    浅析JavaScript异步代码优化

    本文将深入探讨JavaScript异步编程的问题及其优化策略。 首先,我们来关注最常见的一个问题——回调地狱(Callback Hell)。在处理一系列相互依赖的异步操作时,如果每个操作都嵌套在前一个操作的回调函数中,就会...

    JavaScript高级与设计模式.zip

    4. **异步编程(Asynchronous Programming)**:JavaScript是单线程的,但通过事件循环和回调函数、Promise、async/await等机制实现了异步处理,避免了程序阻塞。 5. **ES6及以后的语法特性**:包括箭头函数、类、...

Global site tag (gtag.js) - Google Analytics