在JavaScript的世界中,所有代码都是单线程执行的。导致浏览器的事件,网络操作都是通过回调函数执行的。
//比如
function done(){
console.log('事件函数')
}
setTimeout(done(),1000);
这样的函数虽然达到了想要的效果,但是一但出现多个回调,结构就会非常复杂,代码可维护性就会变差,于是出现了promise对象。
promise译为承诺。接受一个拥有两个参数的函数,一个参数为resolve,指成功执行的方法,另一个为reject,指失败的回调。
//下面是一个简单的例子
//定义一个0-2的随机数,当随机数小于1的时候打印“200 OK”,否则打印失败
function text(resolve,reject) {
//定义一个0-2的随机数
var timeout = Math.random() *2;
console.log('得出的随机数为'+timeout);
setTimeout(function () {
if(timeout < 1){
resolve("200 ok")
}else{
reject("大于1的数"+timeout)
}
}, timeout*1000)
}
var p1 = new Promise(text)
p1.then(function (result) {
console.log('成功'+result)
}).then(function (result) {
console.log('成功2' + result)
}).catch(function (reason) {
console.log("失败"+reason)
})
实际项目中的promise应用
"use strict";
/**
* 查询某条数据
* @param request 请求上下文
* @param where 查询条件
* @param isShow 不希望查询某些字段如查找user时不想查询密码可以传入{password:0}
* 如果只希望看到某些字段{name:1}
*/
exports.findById = function(request,collectionName,id = "",notShow = {}){
return new Promise(function(resolve, reject){
var db = request.server.plugins['hapi-mongodb'].db;
var ObjectID = request.server.plugins['hapi-mongodb'].ObjectID;
db.collection(collectionName).findOne({"_id":new ObjectID(id)},function(err,result){
if(err){
request.server.log(['error'],err);
throw err;
resolve(null);
}else{
resolve(result)
}
});
});
}
//END