2017-04-20 9 views
0

グループ化されたすべてのユーザーとロールを一覧表示する機能があります。今私は、ユーザーの役割をrefidし、グループ名を返す他の関数があります。名前を返そうとしている間、私は約束の保留状態になっています。平均ノードjs promise return undefinded

function getAll() { 
    var deferred = Q.defer(); 

    db.users.find().toArray(function(err, users) { 
     if (err) deferred.reject(err.name + ': ' + err.message); 

     // return users (without hashed passwords) 
     users = _.map(users, function(user) { 
      //console.log(user); 

      return _.omit(user, ['hash']); 
      }); 
     users = _.map(users, function(user){ 
      refId = {}= user['role'][0]['oid']['_id']; 
      //console.log(typeof refId); 
      user = _.omit(user, ['role']); 
      user.role = userRole.userRole(refId).then(function(err,rid){ 
       if(err){ 
        deferred.reject(err.name+':'+err.message); 
       } 
       deferred.resolve(); 
       console.log(deferred.resolve(rid)); 
       return deferred.promise; 
       console.log(deferred.promise); 
      }); 
      return user; 
      //console.log(user); 

     }) 
     // getRefId(users) 
     //console.log(users); 

    deferred.resolve(users); 
}); 

function userRole(rid){ 
    return new Promise((resolve, reject) => { 
     db.groups.findOne({"_id":rid}, function(err, doc){ 
      if(err){ 
       reject(err.name + ':' + err.message); 

      } 
      if(doc){ 
       resolve({"name": doc.name}); 
       //console.log(doc.name); 
      } 
     }) 
    }) 
} 

答えて

0

あなたは、あなたがここでやっているように見えるマングースまたはノードのネイティブMongoのドライバとの約束を使用したい、あなたはどこにでもnew Promise()を使用する必要はありません。約束を直接使うことができます。

のドキュメントを参照してください:

公式MongoDBのNode.jsのドライバは、両方のコールバックベースだけでなく、MongoDBのは、アプリケーションがES6の新機能を最大限に活用できるようにするとベースの相互作用を約束を提供します。

.SAVE等

マングース非同期動作、()とクエリ、約束/ A +準拠約束を返します。つまり、MyModel.findOne({})、then()、MyModel.findOne({})、exec()(coを使用している場合)を生成できます。

この代わりの

function userRole(rid){ 
    return new Promise((resolve, reject) => { 
     db.groups.findOne({"_id":rid}, function(err, doc){ 
      if(err){ 
       reject(err.name + ':' + err.message); 

      } 
      if(doc){ 
       resolve({"name": doc.name}); 
       //console.log(doc.name); 
      } 
     }) 
    }) 
} 

あなたが使用することができるはず:

function userRole(rid){ 
    return db.groups.findOne({ _id: rid }); 
} 

か:

const userRole = rid => db.groups.findOne({ _id: rid }); 

現在、ご使用のバージョンには1つの問題があります。エラーがなければ約束は解決されませんが、docが偽装されている可能性があります。しかし、あなたが呼ぶ方法が最初に約束を返すならば、あなた自身の約束を作ることに意味はありません。

カスタムエラーメッセージをしたい場合でも、使用することができます。

function userRole(rid){ 
    return db.groups.findOne({ _id: rid }) 
    .catch(function (err) { 
     return Promise.reject(err.name + ':' + err.message); 
    }); 
} 

またはこれをより近代的な構文で:

const userRole = rid => db.groups.findOne({ _id: rid }) 
    .catch(err => Promise.reject(`${err.name}:${err.message}`)); 
+0

HI実際に私が使用していmongoskinを。まだ苦しい –