在JavaScript的世界中,所有代碼都是單線程執(zhí)行的。導(dǎo)致瀏覽器的事件,網(wǎng)絡(luò)操作都是通過回調(diào)函數(shù)執(zhí)行的聚至。
//比如
?function done(){
? ? console.log('事件函數(shù)')
}
? setTimeout(done(),1000);
這樣的函數(shù)雖然達(dá)到了想要的效果,但是一但出現(xiàn)多個(gè)回調(diào)本橙,結(jié)構(gòu)就會非常復(fù)雜,代碼可維護(hù)性就會變差脆诉,于是出現(xiàn)了promise對象甚亭。
promise譯為承諾贷币。接受一個(gè)擁有兩個(gè)參數(shù)的函數(shù),一個(gè)參數(shù)為resolve亏狰,指成功執(zhí)行的方法役纹,另一個(gè)為reject,指失敗的回調(diào)暇唾。
//下面是一個(gè)簡單的例子
//定義一個(gè)0-2的隨機(jī)數(shù)促脉,當(dāng)隨機(jī)數(shù)小于1的時(shí)候打印“200 OK”,否則打印失敗
function text(resolve,reject) {
? ? ? ? ? ? //定義一個(gè)0-2的隨機(jī)數(shù)
? ? ? ? ? ? var timeout = Math.random() *2;
? ? ? ? ? ? console.log('得出的隨機(jī)數(shù)為'+timeout);
? ? ? ? ? ? setTimeout(function () {
? ? ? ? ? ? ? ? if(timeout < 1){
? ? ? ? ? ? ? ? ? ? resolve("200 ok")
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? reject("大于1的數(shù)"+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)
? ? ? ? })
實(shí)際項(xiàng)目中的promise應(yīng)用
"use strict";
/**
* 查詢某條數(shù)據(jù)
* @param request 請求上下文
* @param where 查詢條件
* @param isShow 不希望查詢某些字段如查找user時(shí)不想查詢密碼可以傳入{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