1.什么是promise?使用promise有什么优势?

promise是异步编程的一种解决方案,优势是可以避免层层嵌套的回调。

2.产生背景:
在promise出现之前,你肯定写过这样的代码:

$.ajax({
    url1: '......',
    success: function (data1) {
        $.ajax({
            url2: '......',
            success: function (data2) {
               ... //data2的某些操作依赖于data1
            }
        });
    }
});

上述代码中,如果还有data3依赖于data2,那么上述代码将会存在更深层次的嵌套,promise的出现就是解决这些嵌套带来的不优雅和低可读性等问题。

3.promise使用介绍

promise是一个对象,从这个对象中我们可以获取异步操作的结果。
promise代表一个异步操作,有三种状态:
Pending(进行中)、Resolved(已完成,又称 Fulfilled)和Rejected(已失败)。

创建一个promise:

var promise = new Promise(function(resolve,reject){
    ...some code, such as http request
    if(success){
        resolve(data);   //异步请求成功时,通过resolve向外传递结果
    } else {
        reject(error);   //异步请求失败时,通过reject向外传递结果
    }
});

简单使用案例:

var MongoClient = require('mongodb').MongoClient;

var getData = function(url){
    var promise = new Promise(function(resolve,reject){
    MongoClient.connect(url, function(err, db){
        if(db){
             var collection = db.collection('users');
             collection.find({}).toArray(function(err,docs){
                resolve(docs);
             });
        }
        if(err){
            reject(err);
        }
    });
    });
    return promise;
}

getData('mongodb://localhost:27017/zuckjet').then(function(data){
    console.log(data);
},function(err){
    console.log(err);
});

上述代码中,首先创建了一个函数getData,该函数返回一个promise实例。在该promise实例中,执行的异步操作代码是访问本地mongodb数据库数据。当请求数据成功时,通过resolve对外传递请求结果。当请求失败时,通过reject对外传递错误信息。
promise.then()接受两个回调函数作为参数,第一个回调函数接收的是请求成功时的数据,即上述代码中resolve(docs)中的doc,第二个回调函数接收的是请求失败时的信息,即上述代码中reject(err)中的err。


Zuckjet
437 声望657 粉丝

学如逆水行舟,不进则退。