2017-07-18 132 views
0

我想打包函數中的一些邏輯。邏輯應評估承諾的結果,然後返回一個值或拋出一個異常(根據承諾的值返回條件)。JS:條件返回函數包裝承諾返回函數

讓我分享一個simpliefied代碼:

function GetID(exp, db){ 

    let rxPtt = new RegExp(exp, 'gi'); 

    let tID = db.collection('Col').find(
       { "Name": { $regex: rxPtt }}, {"_id": 1}).toArray(); 

    let retVal = null; 
    tID.then(function (x){ 
     if(x.length > 1){ 
      console.log("More than one"); 
     } else if (x.length < 1) { 
      console.log("Less than one"); 
     } else { 
      retVal = x; 
     } 
    }); 

    return retVal; 
} 


MongoClient.connect(url, function(err, db) { 

    if(err) throw err; 

    console.log(GetID('t', db)); 

    db.close(function(){ 
     console.log("Close connection"); 
    }) 

}); 

這將返回:

# ./SmallScripts.js 
null 
Close connection 
More than one 

問題: 我感興趣的是如何從一個承諾包裝有條件返回值。如果我只是傳承諾言並最終確定它,它就會起作用(見下文)。不過,我想把整個邏輯放到一個地方,然後返回ID。讓我知道這應該做的正確的方式和任何提示如何可能的話考慮它。謝謝!

function X(db){ 

    let r = db.collection('Col') 
      .find(
       { "Name": { $regex: /t/i}}, {"_id": 1} 
      ).toArray(); 

    return r; 
} 

MongoClient.connect(url, function(err, db) { 
    if(err) throw err; 

    let r = X(db); 

    r.then(function(res){ 
     if(res.length > 1){ 
      console.log("More than one"); 
     } else if (res.length < 1) { 
      console.log("Less than one"); 
     } else { 
      console.log(res);; 
     } 
    ); 

    db.close(function(){ 
     console.log("Close connection"); 
    }) 
}); 
+0

經過一些額外的研究,似乎沒有任何意義,期望異步調用結果被打印在同步階段(最外面的程序範圍)。就像這裏所說:https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call –

回答

0

您可以簡單地使用Promise來返回像這樣的結果。

var Q = require('q'); 
var deferred = Q.defer(); 

MongoClient.connect(url, function(err, db) { 
     if(err) throw err; 
     db.collection('Col') 
       .find(
        { "Name": { $regex: /t/i}}, {"_id": 1} 
       ).toArray(function(err, res){ 
        if(err) 
         deferred.reject(err); 
        if(res.length > 1){ 
         console.log("More than one"); 
        } else if (res.length < 1) { 
         console.log("Less than one"); 
        } else { 
         console.log(res); 
        } 
        deferred.resolve(res); 
       }); 
       return deferred.promise; 

     db.close(function(){ 
      console.log("Close connection"); 
     }) 
    });