Promise.prototype.then()

该新特性属于 ECMAScript 2015(ES6)规范,在使用时请注意浏览器兼容性。

概述

then()方法返回一个 Promise它有两个参数:分别为 Promise 在成功和失败情况下的回调函数。

注意事项:如果两个参数都被省略,或提供的不是函数,那么将创建一个没有其他处理程序的新 Promise,只需采用 Promise 的最终状态,然后再调用。如果省略第一个参数或提供的不是函数,创建的新 Promise 简单地采用 Promise 的完成状态,然后调用它(如果它变为完成)。如果省略第二个参数或提供的不是函数,创建的新 Promise 简单地采用 Promise 的失败状态,然后调用它(如果它变为失败)。

语法

p.then(onFulfilled, onRejected);

p.then(function(value) {
   // fulfillment
  }, function(reason) {
  // rejection
});

参数

onFulfilled
一个 Function, 当 Promise 为 fulfilled 时调用. 该函数有一个参数, 为成功的返回值。
onRejected
一个 Function, 当 Promise 为 rejected 时调用. 该函数有一个参数, 为失败的原因。

描述

由于 then 和 Promise.prototype.catch() 方法返回promise, 它们可以被链式调用 — 一种称为 composition 的操作.

示例

使用then方法

var p1 = new Promise(function(resolve, reject) {
  resolve("Success!");
  // or
  // reject ("Error!");
});

p1.then(function(value) {
  console.log(value); // Success!
}, function(reason) {
  console.log(reason); // Error!
});

链式调用

then 方法返回 Promise 对象,并允许其方法进行链式书写。

你可以传递一个 lambda 给 then 并且如果它返回一个 promise,一个等价的 Promise 将暴露给后续的方法链。下面的代码片段使用 setTimout 函数来模拟异步代码操作。

Promise.resolve("foo")
  // 1. Receive "foo" concatinate "bar" to it and resolve that to the next then
  .then(function(string) {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        string += 'bar';
        resolve(string);
      }, 1);
    });
  })
  // 2. receive "foobar", register a callback function to work on that string
  // and print it to the console, but not before return the unworked on
  // string to the next then
  .then(function(string) {
    setTimeout(function() {
      string += 'baz';
      console.log(string);
    }, 1)
    return string;
  })
  // 3. print helpful messages about how the code in this section will be run
  // before string is actually processed by the mocked asynchronous code in the
  // prior then block.  
  .then(function(string) {
    console.log("Last Then:  oops... didn't bother to instantiate and return " +
                "a promise in the prior then so the sequence may be a bit " +
                "surprising");

    // Note that `string` will not have the 'baz' bit of it at this point. This 
    // is because we mocked that to happen asynchronously with a setTimeout function
    console.log(string);
});

当一个值只是从一个 lambda 内部返回时,它将有效地返回 Promise.resolve(<由被调用的处理程序返回的值>)。

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 + "- This synchronous usage is virtually pointless"); // 2- This synchronous usage is virtually pointless
});

p2.then(function(value) {
  console.log(value); // 1
});

如果函数抛出错误或返回一个拒绝的承诺,则调用将返回一个拒绝的承诺。

规范

规范 状态 备注
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


相关链接

文档标签和贡献者

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