Promise粗解

一、Promise含义、作用、特点

Promise含义

  • 异步编程的一种解决方案;
  • 简单来说就是一个容器,里面保存这某个未来才会结束的事件(异步操作)的结果;
  • 从语法上来讲,是一个对象,可以获取异步操作的消息;

Promise作用

  • 可避免回调金字塔式的代码;
  • 优化异步流程;
  • 得到异步流程中的错误;

Promise对象的特点

对象的状态不受外界影响

  • Promise对象代表一个异步操作,用三种状态:pending(进行中)、resolve(已完成)、reject(已失败),只有异步操作的结果,可以决定当前是那种状态,任何其他操作都无法改变这个状态;

一旦状态改变,就不会再变,任何事情都可以得到这个结果;

  • Promise对象的状态改变只有两种可能,从pending到resolve和pending到reject;

二、基本用法

  • ES6规定,Promise对象是一个构造函数,用来生成Promise实例

生成Promise实例

let promise = new Promise(function(resolve,reject){
        //do something
        if(异步操作成功){
                resolve(value);
        }else{
                reject(error);
        }
});
  • Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject,两个参数也是函数,由JavaScript引擎提供,不用自己部署;
  • resolve函数的作用是将Promise对象的状态从pending变成resolve,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
  • reject函数的作用是将Promise对象的状态从pending变成reject,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去;

then方法

  • Promise实例生成后,可以用then方法分别指定resolve状态和reject状态的回调函数
promise.then(function(value){
        //success
},function(error){
        //failed
});
  • then方法可以接受两个回调作为参数,第一个回调函数是Promise对象的状态变为resolve时调动,第二个则是转变为reject时调用,第二个函数可选;
  • then方法返回的是一个新的Promise实例(不是原来的Promise实例),因此可以采用链式写法,即then方法后面再调用另一个then方法;

catch方法

  • catch方法是.then(null,reject)的别名,用于指定发生错误时的回调函数;

Promise.all()方法

  • Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例;
  • 用于多个Promise实例一起运行,都运行完毕返回结果;

Promise.race()方法

  • Promise.race方法同样是将多个Promise实例,包装成一个新的Promise实例。
  • 用于多个Promise实例一起运行,只要有一个运行完毕就返回结果;

Promise.resolve()

  • 有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用;

Promise.reject()

  • Promise.reject(resson)方法也会返回一个新的Promise实例,该实例的状态为reject;

done()

  • Promise对象的回调链,不管以then方法或catch方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为Promise内部的错误不会冒泡到全局)。因此,我们可以提供一个done方法,总是处于回调链的尾端,保证抛出任何可能出现的错误。

finally()

  • finally方法用于指定不管Promise对象最后状态如何,都会执行的操作。它与done方法的最大区别,它接受一个普通的回调函数作为参数,该函数不管怎样都必须执行。

三、代码实例

多个异步操作,相互之间传递数据

let add1 = function (value) {
    return new Promise(function(resolve,reject){
        setTimeout(resolve(value + 1),1000)
    });
};

let add2 = function (value) {
    return new Promise(function(resolve,reject){
        setTimeout(resolve(value + 2),1000)
    });
};

let add3 = function (value) {
    return new Promise(function(resolve,reject){
        setTimeout(resolve(value + 3),1000)
    });
};

let add4 = function (value) {
    return new Promise(function(resolve,reject){
        setTimeout(resolve(value + 4),1000)
    });
};

add1(0)
    .then(function (value) {
        console.log(value);
        return add2(value);
    })
    .then(function (value) {
        console.log(value);
        return add3(value);
    })
    .then(function (value) {
        console.log(value);
        return add4(value);
    })
    .then(function (value) {
        console.log(value);
    })
    .catch(function (error) {
        console.log(error);
    })
------
1
3
6
10
  • 多个异步操作,每个异步操作都需要上一个一步操作的结果,保证每个异步操作都返回一个Promise对象;
  • then方法之后,也要用return传递异步操作的结果;

all()方法和race()方法

  • 大家一起走,全部到达终点就吃饭;
Promise.all([add1(0),add2(0),add3(0),add4(0)])
    .then(function (value) {
        console.log(value);
    })
    .catch(function (error) {
        console.log(error);
    });
------
[ 1, 2, 3, 4 ]
  • 大家一起走,只要一个人到达终点,就开始吃饭;
Promise.race([add1(0),add2(0),add3(0),add4(0)])
    .then(function (value) {
        console.log(value);
    })
    .catch(function (error) {
        console.log(error);
    });
------
1

待续...

时间: 2024-12-11 06:20:16

Promise粗解的相关文章

CSLM 配置粗解

CSLM工具(continuous space language model toolkit)用于训练NNLM,支持SRILM.KENLM(默认)语言模型工具,CUDA加速,CSTM统计机器翻译. 本文粗略介绍在SRILM与CUDA环境下配置CSLM工具过程.操作系统为Ubuntu64bit 13.04 桌面版,Xeon系列CPU,GEFORCE显卡... 下载并安装CUDA toolkit 下载并安装SRILM 下载并安装Atlas BLAS或Intel_MKL 下载并安装boost库 ./b

最小费用最大流粗解 poj2516

最小费用最大流,一般解法如下: 在流量基础上,每条边还有权费用,即单位流量下的所需费用.在最大流量下,求最小费用.解法:在最大流算法基础上,每次按可行流增广改为每次用spfa按最小费用(用单位费用)增广,每次按每条边一单位费用求到达终点的最小费用(最短路),那么每次找到"最短路"(只是一条路,不是多条(dinic每次可以增广多条)),之后按这条路最大 可能流量增广(取这条路上残量最小的),直到无法增广为止.(实现细节点代码备注). 该题题意:m个供应地向n个商店供应k种物品,对于每种物

Promise详解

本文主要通过对Promise的八大特性讲解,来详细探讨Promise. 1.立刻执行性 const p = new Promise((resolve, reject) => { console.log("create a promise"); resolve("success"); }); console.log("after new Promise"); p.then((value) => { console.log(value);

关于Promise详解

异步回调 回调地狱 在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的回调地狱 并行结果 如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完成后才能执行后续的任务,无法实现并行节约时间 Promise Promise本意是承诺,在程序中的意思就是承诺我过一段时间后会给你一个结果. 什么时候会用到过一段时间?答案是异步操作,异步是指可能比较长时间才有结果的才做,例如网络请求.读取本地文件等 Promise的三种状态 Pending Promise对象实例创建时

ES6 Promise 详解

一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: 1.对象的状态不受外界影响.Promise 对象代表一个异步操作,有三种状态: (1).pending: 初始值 (2).fulfilled:  操作成功 (3).rejected: 操作失败 只有异步操作的结果可以决定当前是哪一个状态,任何其他状态都无法改变这个状态. 2.一旦状态改变,就不会再

Apache Httpd服务器之缓存粗解

当我们通过浏览器输入一个网址,然后服务器响应给我们内容时,服务器会有一个非常复杂的处理过程.服务器并不是每次都会根据我们请求的页面在磁盘上读取页面内容,然后将这些内容返回给浏览器供我们浏览.如果这样,那么当浏览器的并发请求特别多时,会对服务器造成很大的负载.那么服务器如何在并发请求特别大时还能保持响应水准呢?为了解决这一问题,http协议引进了缓存标准.而apache httpd服务器实现了http协议的这一标准.当然,请求和响应是双向的,所以缓存也不仅仅是在服务器这一端来实现,目前的主流浏览器

粗解python的@classmethod和@staticmethod及普通实例方法

引言: 使用不同的函数定义方法,可以使得函数定义更加有效而且易于维护 本文为博主原创,根据本人自己的理解整理而成,若有不准确的地方,希望能留言告知以免误导他人: 首先进一段代码,来直观感受一下不同类型的函数的定义方法: >>> >>> class A(object): a = 1 def instance_method(self): print '实例方法打印类变量a: %s' % self.a @classmethod def class_method(cls): p

&& 和 ||粗解

可以这么理解 &&是来找假的,如果找到假就返回假,如果找不到,就返回最后一个真 ||是来找真的,如果找到真就返回真,如果找不到,就返回最后一个假 var speed = 12; var level =(speed<5 && 1)||(speed<10 && 2)||(speed<15 && 3)||(speed<20 && 4);

git使用粗解

Git 使用教程 Installation 1.1           git installation in linux http://git-scm.com/downloads download sw package $tar -zxvf git-1.8.5.tar.gz $cd git-1.8.5 $./configure $make $sudo make install 1.2           git installation in windows msysgit是 Windows版