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。