2017-07-18 5 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 

QUESTION: を私は約束ラッパーから条件付き値を返す方法に興味があります。約束を守り、最終的にそれを確定すれば、それは機能します(下記参照)。しかし、私はロジック全体を1つの場所にまとめて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

追加調査の結果、非同期呼び出しが同期コンテキスト(outtestプログラムスコープ)に出力されるとは思われません。ここに記載されているように: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"); 
     }) 
    }); 
関連する問題