构造函数

new Promise(function(resolve, reject){});

构造函数接受一个函数(executor)作为参数,该函数在返回 Promise 实例之前被调用。函数的两个参数分别是 resolve 和 reject 函数。

如果 executor 函数执行中抛出异常,则 Promise 视为 rejected。

executor 函数返回值没有意义。

类方法

Promise.all(iterable)

类似于 jQuery.when() 方法,只有 iterable 中所有的 Promise 都被 resolve,它返回一个新的被 resolve 的 Promise,resolved 值为 iterable 中所有 resolved 值组成的数组;或者 iterable 中只要有一个 Promise 被 reject,则立刻返回一个新的被 reject 的 Promise,rejected 值同时传递给新的 Promise。

Promise.race(iterable)

一旦 iterable 中任何一个 Promise 被 resolve 或 reject,则立即返回一个新的被 resolve 或 reject 的 Promise。

Promise.reject(reason)

返回一个 rejected Promise。

Promise.resolve(value)

返回一个新的 Promise。如果 value 是一个 thenable 对象(Promise),新 Promise 状态与 thenable 一致;否则新 Promise 状态为 resolved,Promise 结果为 value。

实例方法

Promise.prototype.catch(onRejected)

返回一个新的 Promise。Promise 将 rejected 值视为一个 error,通过 catch 方法可以捕捉 rejected 值,并将该值传递给 onRejected 函数。onRejected 函数返回值将作为新 Promise 的 resolve 参数,也就是说,如果 onRejected 返回值是一个 Promise,则新 Promise 与该 Promise 状态一致;否则新 Promise 状态为 resolved,结果值为 onRejected 返回值。

如果一个 rejected Promise 没有调用过 catch 方法,在谷歌浏览器控制台会输出异常提示 Uncaught (in promise) 1

Promise.prototype.then(onFulfilled, onRejected)

返回一个新 Promise。如果 onFulfilled 和 onRejected 是函数,则使用它们的返回值作为新 Promise 的 resolve 参数。否则新 Promise 与旧 Promise 状态保持一致。

then 与 catch

虽然 then 方法可以分别处理 resolution 和 rejection 两种情景,但 ES6 Promise 将 rejection 更多地视作异步异常情景,因此提供 catch 方法处理 rejection 情景。

所以好的实践是使用 then 方法处理 resolution,catch 方法处理 rejection。

// 不推荐
asyncRun().then(function(value) {}, function(error) {}); // 推荐
asyncRun().then(function(value){}).catch(function(rejected) {});

尤其当需要链接多个 Promise 时,使用 then + catch 模式会让代码更加清晰。

// 不推荐
asyncRun()
.then(function(value) {}, function(error) {})
.then(function(value) {}, function(error) {})
.then(function(value) {}, function(error) {}); // 推荐
asyncRun()
.then(function(value){})
.then(function(value){})
.then(function(value){})
.catch(function(rejected) {});

Deferred 对象

ES6 取消了 Deferred 对象,鼓励直接使用 Promise,而且主张 Promise 应该由它的创建者来 resolve 或 reject。

但某些场景下,Deferred 对象仍然是一种更好的选择,尤其是 Promise 创建者与求值者分属不同对象时。

基于 ES6 Promise 实现的 Deferred 对象

简洁版:

function Deferred() {
var self = this;
var promise = this.promise = new Promise(function(resolve, reject) {
self.resolve = resolve;
self.reject = reject;
});
this.then = this.promise.then.bind(promise);
this.catch = this.promise.catch.bind(promise);
this.catch(function() {});
}

完整版:

/*
* @Author: laixi
* @Date: 2016-11-18 11:40:06
* @Last Modified by: laixi
* @Last Modified time: 2016-11-18 12:36:26
*/
var Deferred = function(beforeStart) {
if (!(this instanceof Deferred)) {
return new Deferred(beforeStart);
} var _resolve; // resolve function
var _reject; // reject function
var _result; // resolved value or rejected reason
var _state = 'pending'; // promise status
var doneCallbacks = [];
var failCallbacks = [];
var alwaysCallbacks = []; // create promise object
var promise = new Promise(function(resolve, reject) {
_resolve = resolve;
_reject = reject;
}); // eliminate annoying error prompt at Chrome console
promise.catch(function() {}); // respectively call callbacks in done callback queue or fail callback queue
promise.then(function(value) {
_result = value;
while (doneCallbacks.length > 0) {
var callback = doneCallbacks.splice(0, 1)[0];
callback.call(promise, value);
}
}, function(reason) {
_result = reason;
while (failCallbacks.length > 0) {
var callback = failCallbacks.splice(0, 1)[0];
callback.call(promise, reason);
}
}); // extend promise by adding done, fail, always.
// ---------------------------------------------- promise.done = function(callback) {
if (typeof callback === 'function') {
if (_state === 'resolved') {
callback.call(promise, _result);
} else {
doneCallbacks.push(callback);
}
}
return promise;
}; promise.fail = function(callback) {
if (typeof callback === 'function') {
if (_state === 'rejected') {
callback.call(promise, _result);
} else {
failCallbacks.push(callback);
}
}
return promise;
}; promise.always = function(callback) {
if (typeof callback === 'function') {
if (_state === 'pending') {
alwaysCallbacks.push(callback);
} else {
callback.call(promise, _result);
}
}
return promise;
}; this.promise = function() {
return promise;
}; this.state = function() {
return _state;
}; this.resolve = function(value) {
_state = 'resolved';
_resolve.call(promise, value);
}; this.reject = function(reason) {
_state = 'rejected';
_reject.call(promise, reason);
}; this.catch = promise.catch.bind(promise);
this.then = promise.then.bind(promise);
this.done = promise.done.bind(promise);
this.fail = promise.fail.bind(promise);
this.always = promise.always.bind(promise); if (typeof beforeStart === 'function') {
beforeStart.call(this, this);
}
};

ES6 Promise 接口的更多相关文章

  1. 如何把 Callback 接口包装成 Promise 接口

    最近一段时间一直在看Node.js,在开发过程中经常要调用一些异步接口,通常在接口的最后一个参数会传入一个回调函数,可以用来处理异常,非异常情况.大致模式如下: var fs = require(“f ...

  2. 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

    Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve ...

  3. ES6 Promise 全面总结

    转载:点击查看原文 ES6 Promise对象 ES6中,新增了Promise对象,它主要用于处理异步回调代码,让代码不至于陷入回调嵌套的死路中. @-v-@ 1. Promise本质 Promise ...

  4. 微信小程序Http高级封装 es6 promise

    公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意. 于是上网查了一下,就开始着手开发..... 首先开发客户端的东西,都有个共同点,那就是  数据请求! 看了下小程序的请求方式大概和a ...

  5. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  6. ES6 Promise 异步操作

    最近越来越喜欢与大家进行资源分享了,并且及时的同步到自己的园子内,为什么呢? 一.小插曲(气氛搞起) 在上个月末,由于领导的高度重视(haha,这个高度是有多高呢,185就好了),走进了公司骨干员工的 ...

  7. 解析ES6 Promise

    ES6 Promise 概念之类的,大概读者都应该有所知道,接下来我们直入终点. 先让我们来看看什么是Promise吧,他是一个object,类,arry,function? 首先,学习它的时候应该讲 ...

  8. jquery Promise和ES6 Promise的区别

    1. Deferred对象有resolve和reject方法,可以直接修改状态 jquery用Deferred实现了Promise规范,Deferred与ES6 Promise的最大区别是: Defe ...

  9. ES6 Promise对象then方法链式调用

    then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调函数.then()方法会返回一个新的Promise实例,所以then()方法后面可以继 ...

随机推荐

  1. atitit. js 跨界面 页面 web cs 传值方法总结

    atitit. js 跨界面 页面 web cs 传值方法总结 #--需求 js #---两个方法:   直接传跟跟间接传递... 1.直接传跟new form(param)    web使用url方 ...

  2. atitit.添加win 系统服务 bat批处理程序服务的法总结instsrv srvany java linux

    atitit.添加win 系统服务 bat批处理程序服务的法总结instsrv srvany  java linux 系统服务不同于普通视窗系统应用程式.不可能简简单单地通过运行一个EXE就启动视窗系 ...

  3. UC脱茧蜕变,移动资讯市场格局再生变

    日前,UC浏览器正式更名为UC,同时正式发布大数据驱动的独立资讯应用“UC头条”.而整个UC品牌也从工具类升级为优质资讯内容平台,并吹响了向“大数据新型媒体平台”进军的冲锋号.根据UC官方公布的数据显 ...

  4. iOS---SQLite数据库框架之FMDB -Swift

    SQLite数据库框架之FMDB 什么是FMDB? FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API.对比苹果自带的Core Data框架,更加轻量级 ...

  5. Leetcode 263 Ugly Number 数论 类似质因数分解

    Ugly Number的质因数仅为2,3,5 将输入的数分别除以2,3,5直到不能除,看是否为1,为1的是Ugly Number,其他则不是. class Solution { public: boo ...

  6. SqlServer 查看事务锁及执行语句

    一.查看当前锁定的事务 ,) ,用户机器名称,) ,是否被锁住),blocked) ,数据库名称,),cmd 命令,waittype as 等待类型 ,last_batch 最后批处理时间,open_ ...

  7. 为何在font-family属性中设置多个值

    通常前端开发中会对body标签中设置font-family属性多个值,例如: body{padding:0;margin:0;font-size:12px;text-align:left;font-f ...

  8. C#:WebBrowser中伪造referer,为何对流量统计器无效?

    使用webbrowser伪造referer的方法:webBrowser1.Navigate(url, "_self", null, "Referer:http://www ...

  9. 制作6寸 kindle pdf

    设置word 纸张大小为 90mm*117mm 然后保存为 pdf 就好了.

  10. linux的库文件

    静态库和动态库 在windows中静态库是以 .lib 为后缀的文件,共享库是以.dll 为后缀的文件.在linux中静态库是以 .a 为后缀的文件,共享库是以 .so为后缀的文件. 以linux下的 ...