该新特性属于 ECMAScript 2015(ES6)规范,在使用时请注意浏览器兼容性。
概述
then()
方法返回一个Promise。
它有两个参数,分别为Promise在 success 和 failure 情况下的回调函数。
语法
p.then(onFulfilled, onRejected); p.then(function(value) { // 满足 }, function(reason) { // 拒绝 });
参数
- onFulfilled
- 一个
Function
, 当Promise
为 fulfilled 时调用. 该函数有一个参数, 为成功的返回值. - onRejected
- 一个
Function
, 当Promise
为 rejected 时调用. 该函数有一个参数, 为失败的原因.
描述
由于 then
和 Promise.prototype.catch()
方法返回promise, 它们可以被链式调用 — 一种称为 composition 的操作.
示例
使用then方法
var p1 = new Promise(function(resolve, reject) { resolve("成功!"); // or // reject ("错误!"); }); p1.then(function(value) { console.log(value); // 成功! }, function(reason) { console.log(reason); // 错误! });
链式调用
因为then方法返回一个
Promise
,你可以轻易地链式调用then
。但当返回值不是从 onFulfilled
或者 onRejected
所返回的 Promise 时,它会自动包装为 resolve 过的 Promise 作为返回值.
var p2 = new Promise(function(resolve, reject) { resolve(1); }); p2.then(function(value) { console.log(value); // 1 return value + 1; }).then(function(value) { console.log(value); // 2 });
你也可以在别的什么函数上用Promise的基础API实现链式操作。
function fetch_current_data() { // fetch() API 返回一个Promise对象。 这个函数 // 暴露了一个类似的API, 除了返回成功值 // 你还可以做点别的。 return fetch("current-data.json").then((response) => { if (response.headers.get("content-type") != "application/json") { throw new TypeError(); } var j = response.json(); // 可以针对j的做其他操作 return j; // 返回给fetch_current_data().then()调用者的值 }); }
规范
规范 | 状态 | 备注 |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Promise.prototype.then |
Standard | ECMA标准的首次定义 |
ECMAScript 2017 Draft (ECMA-262) Promise.prototype.then |
Draft |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 32 | 29.0 (29.0) | 未实现 | 19 | 7.1 |
Feature | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|
Basic support | 未实现 | 29.0 (29.0) | 未实现 | 未实现 | 8 | 32 |
参考