首先来回想一下Promise对象的写法:

// 方法1
let promise = new Promise ( (resolve, reject) => {
if ( success ) {
...
resolve(a); // pending ——> resolved 参数将传递给对应的回调方法
} else {
...
reject(err); // pending ——> rejected
}
} ) // 方法2
function promise () {
return new Promise ( function (resolve, reject) {
if ( success ) {
...
resolve(a);
} else {
...
reject(err);
}
} )
}

①Promise对象有三种状态:pending、resolved、rejected。

②并且Promise对象在实例化之后内部代码会立即执行,并且会由pending状态转化为其余两种状态。

③这些立即执行的代码与外部代码是同步的,即:按先后顺序依次执行(js的单线程特性)

var b ;
function a(){
b = new Promise(function(resolve, reject){
console.log('over');
resolve('over');
});
}
a();
b.then(n=>console.log(n));
console.log("begin-----");

a()函数的执行,为b变量进行了初始化操作,使得b成为了一个Promise对象;

于是这个Promise对象(b)内部的代码会立即执行---console.log('over'),并获得resolved状态;

接下来执行b(Promise对象)的then方法,由于

④then方法内部回调是异步的,所以等待其余同步代码先执行;

console.log("begin-----");这是一个同步操作,会紧接着上一个同步代码(console.log('over'))执行;

最终,虽然Promise对象的then方法排在第二步,由于它是异步的,导致内部回调函数最后执行;

控制台依次输出:over;begin-----;over。

既然前面说到Promise对象在实例化之后可能获得两个不同状态,那么自然对这两个状态都有不同的方式去处理;

⑤then(success(),error()),针对不同状态进行不同处理,即两个不同的回调函数,并将获得状态时的函数参数传递到回调函数里

⑥catch(error),用于处理rejected状态传递出来的error对象,所以通常then()不用写error()回调,直接由catch来捕获错误,

并且还可以捕获上面success()回调产生的错误。

待续。。。

ES6浅谈之Promise的更多相关文章

  1. ES6 浅谈let与const 块级作用域之封闭空间(闭包)

    ES6新增了 let const 命令,用来声明变量.它的用法类似于 var  ,但是所声明的变量,只在 let const 命令所在的代码块内有效.  var const 不允许重复声明 用处: 可 ...

  2. 12.24 ES6浅谈--块级作用域,let

    第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前. 1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区 ...

  3. ES6 浅谈Reflect

    Reflect 属于一个静态类,不能通过new的方法去创建实例,只能调用静态类中的一些静态方法,Reflect内部封装了一系列对对象的底层操作, Reflect 成员方法就是Proxy处理对象的默认实 ...

  4. 浅谈ES6原生Promise

    浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...

  5. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  6. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

  7. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  8. 浅谈Vue.js

    作为一名Vue.js的忠实用户,我想有必要写点文章来歌颂这一门美好的语言了,我给它的总体评价是“简单却不失优雅,小巧而不乏大匠”,下面将围绕这句话给大家介绍Vue.js,希望能够激发你对Vue.js的 ...

  9. 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route

    心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...

随机推荐

  1. javascript setinterval 正确的语法

    前几天我用setinterval 写了一个小程序,这个setinterval是用来干什么的我就不解释了. 写的方法在其它的浏览器里都能用,后来测试组的同事拿去一测就出了问题.因为她们爱用360,还有I ...

  2. flex 强制转换类型失败无法将object转换为XXX

    错误描述 flex在加载module时报出如题所示的错误, 实际表现 问题就出现在这 我取消这个错误提示框 再次在前台查询数据 就一切ok 问题就出现在这一句 var zoufangModel:ZfR ...

  3. pig运行方法:本地与云上

    pig脚本 放在本地当前目录(键入pig命令时,所处的目录),然后用进入grunt,用run或者exec调用 1云运行: 键入pig进入grunt,用run命令运行当前目录脚本.(或者外部用pig - ...

  4. PA 创建项目

    ---- 创建项目 DECLARE l_orig_project_id NUMBER := 6; l_prj_num VARCHAR2(240) := 'CXYTEST001'; l_start_da ...

  5. (NO.00003)iOS游戏简单的机器人投射游戏成形记(六)

    为什么要将手臂移动的代码单独放在一个方法中? 其实这里是多次重构之后的版本.原来的移动代码是放在touchMoved方法里的.后来发现除了触摸手臂移动方式外,还要实现触摸屏幕移动手臂这第二种方式. 所 ...

  6. unity 实现流光效果

    1.通过一些简单效果可以让我们更好的去理解shader,具体都在代码注释中: Shader "Unlit/MoveLightImage" { Properties { //主纹理 ...

  7. ISLR系列:(4.2)模型选择 Ridge Regression & the Lasso

    Linear Model Selection and Regularization 此博文是 An Introduction to Statistical Learning with Applicat ...

  8. 非阻塞IO模式原理

    与阻塞模式对应的另一种模式叫非阻塞IO模式,在整个通信过程中读和写操作不会阻塞,当前处理线程不存在阻塞情况.从A机器到B机器它的通信过程是:A机器一条线程将通道设置为写事件后往下执行,而另外一条线程遍 ...

  9. AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除

    AngularJS实现表格数据的编辑,更新和删除 效果 实现 首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据 var app = angular.module('plunker', [' ...

  10. android ViewPager+Fragment之懒加载

    说说写这篇博客的背景吧,前两天去面试,问到一个问题说的是:比如我们首页,是有3个fragment构成的,并且要是实现作用可以滑,那么这个最好的选择就是ViewPager+fragment了,但是我们知 ...