Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Promise.prototype.then()

该新特性属于 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


参考

文档标签和贡献者

 此页面的贡献者: RandyLoop, hipop, liuyiqian, fskuok, mountainmoon
 最后编辑者: RandyLoop,