这是我参与更文挑战的第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 决定,分成两种情况。
- 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
- 只要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,希望对大家有所帮助