Rick's Studio.

Promise 对象

2018/03/20 Share

基本用法

Promise对象可以将异步操作以同步操作的方式展现出来,避免了层层嵌套的回调函数。
Promise对象基本用法

var promise = new Promise (function(resolve,reject) {
    if(/*异步操作成功*/){
        resolve(value);
    }else{
        reject(error);
    }
});

promise.then(function(value) {
    //success
},function(value) {
    //failure
});

Promise.prototype.then方法:链式操作

Promise.prototype.then方法是返回一个新的Promise对象,因此可以采用链式写法

getJSON("/posts.json").then(function(json) {
    return json.post;
}).then(function(post) {
    // proceed
});

上面的代码依次制定了两个回调函数,第一个回调函数完成后会将结果作为参数传入第二个回调函数,如果第一个函数是Promise对象,那么第二个回调函数会等待Promise对象有了运行结果之后再进行进一步调用。

Promise.prototype.catch方法:捕捉错误

Promise.prototype.catch方法是Promise.prototype.then(null,rejection)的别名,用于指定发生错误时的回调函数。Promise对象的错误有“冒泡性质”,会一直向后传递,直到被捕获位置。

getJSON("/posts.json").then(function(posts) {
// some code
}).catch(function(error) {
// 处理前一个回调函数运行时发生的错误
console.log('发生错误!', error);
});

Promise.all方法,Promise.race方法

Promise.all方法用于将多个Promise实例包装成一个新的Promise实例

var p = Promise.all([p1,p2,p3]);

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.race方法同样是将多个Promise实例包装成一个新的Promise实例。

var p = Promise.race([p1,p2,p3]);

只要p1,p2,p3中有一个率先改变状态,p的状态就随之改变,率先改变的Promise实例的返回值就传递给p的返回值。

Promise.resolve方法,Promise.reject方法

Promise.resolve与Promise.reject方法都是将现有对象转化为Promise对象,Promise.resolve返回的Promise对象状态为fulfilled,Promise.reject返回的Promise对象的状态为rejected。

var p = Promise.resolve('Hello');

p.then(function (s){
console.log(s)
});
// Hello

var p = Promise.reject('出错了');

p.then(null, function (s){
console.log(s)
});
// 出错了 

async函数

async函数是用来取代回调函数的一种方法。

在函数明前加上async关键字就表明该函数内部有异步操作,该异步操作返回一个Promise对象,前面用await关键字注明。当函数执行的时候,一旦遇到await关键字就会先返回,等待异步操作完成然后在继续执行函数后面的语句。

CATALOG
  1. 1. 基本用法
  2. 2. Promise.prototype.then方法:链式操作
  3. 3. Promise.prototype.catch方法:捕捉错误
  4. 4. Promise.all方法,Promise.race方法
  5. 5. Promise.resolve方法,Promise.reject方法
  6. 6. async函数