javascript函数式编程09-高阶函数(Promise)

291 阅读3分钟

这是我参与更文挑战的第15天,活动详情查看: 更文挑战

紧跟上一篇 ,这一篇主要了解高阶函数(Promise)

什么是Promise?

  • MSDN 上的解释: Promise 是一个对象,它代表了一个异步操作的最终完成或者失败。因为大多数人仅仅是使用已创建的 Promise 实例对象,所以本教程将首先说明怎样使用 Promise,再说明如何创建 Promise。

    • 本质上 Promise 是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要在一开始把回调函数作为参数传入这个函数了。
  • ECMAscript 6 原生提供了 Promise 对象。

  • Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。

Promise 创建

  • 让我们看一下创建新promis的语法
new Promise( function(resolve, reject) {...} /* executor */  );
  • 要想创建一个 promise 对象、可以使用 new 来调用 Promise 的构造器来进行实例化。
  • 下面是创建 promise 的步骤:
var promise = new Promise(function(resolve, reject) {
    // 异步处理
    // 处理结束后、调用resolve 或 reject
});
  • Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。
var funPromise = new Promise(function(resolve, reject){
    //当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)
    //在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.
    setTimeout(function(){
        resolve("成功!"); //代码正常执行!
    }, 250);
});
 
funPromise.then(function(successMessage){
    //successMessage的值是上面调用resolve(...)方法传入的值
    console.log("hello" + successMessage);
});
  • 对于已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。

  • promise.then() 是 promise 最为常用的方法。

promise.then(onFulfilled, onRejected)
  • promise简化了对error的处理,上面的代码我们也可以这样写:
promise.then(onFulfilled).catch(onRejected)

Promise.all方法,Promise.race方法

  • Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
var p = Promise.all([p1,p2,p3]);

上面代码中,Promise.all 方法接受一个数组作为参数,p1、p2、p3 都是 Promise 对象的实例。(Promise.all 方法的参数不一定是数组,但是必须具有 iterator 接口,且返回的每个成员都是 Promise 实例。)

p 的状态由 p1、p2、p3 决定,分成两种情况。

  1. 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
  2. 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
// 生成一个Promise对象的数组
var promises = [2, 3, 5, 7, 11, 13].map(function(id){
  return ajaxGet("/post/" + id + ".json");
});
 
Promise.all(promises).then(function(posts) {
  // ...  
}).catch(function(reason){
  // ...
});

Promise.resolve 方法,Promise.reject 方法

  • 有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用。
var jsPromise = Promise.resolve(ajaxFun);
  • 上面代码生成一个新的Promise对象的实例p,它的状态为fulfilled,所以回调函数会立即执行,Promise.resolve方法的参数就是回调函数的参数。

  • 如果Promise.resolve方法的参数是一个Promise对象的实例,则会被原封不动地返回。

  • Promise.reject(reason)方法也会返回一个新的Promise实例,该实例的状态为rejected。

  • Promise.reject方法的参数reason,会被传递给实例的回调函数。

  • 以上所述是给大家介绍的详解JS的Promise,希望对大家有所帮助