JS:从包装promise-returning-function的函数中条件返回

时间:2017-07-18 10:04:36

标签: javascript mongodb asynchronous

我想在函数中包含一些逻辑。逻辑应该评估一个promise的结果,然后返回一个值或抛出一个异常(根据promise的值返回条件)。

让我分享一个简化的代码:

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

问题: 我对如何从promise包装器有条件地返回值感兴趣。如果我只是传递承诺并在最后敲定它,它就可以工作(见下文)。但是我想将整个逻辑包装到一个地方并返回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");
    })
});

1 个答案:

答案 0 :(得分: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");
        })
    });