2016-11-16 16 views
0

Mongooseを使ってMongoDBで何らかの操作をしています。ユーザーが作成したすべてのタスクを調べて、isPerformingの値をfalseに設定して保存します。 ドキュメントでは、mongooseクエリ(.exec()機能付き)が有望です。多くのタスクがありますので、それらを配列にプッシュして、Q.all([...])を使用して並列保存操作を行うと思います。問題は私が.push()をしようとするときです。私のコードは、最初に.push()操作の後に停止します。 他の方法がありますか?Mongooseクエリ(約束)を配列に追加して並列処理を行う

function stopUserTasks(userid) { 

    var deferred = Q.defer(); 
    var query = Task.find({'_creator': userid}).exec(); 

    query.then(function(data, err) { 
     console.log('found: '); 
     console.log(data); 
     if (err) { 
      deferred.reject(err); 
     } 
     return data; 
     }) 
     .then(function(data, err) { 

     var len = data.length; 
     var saveTasksPromises = []; 

     for(var i = len; i--;) { 
      console.log(data[i]._id); 
      saveTasksPromises.push(Task.save({'_id': data[i]._id, 'isPerforming': false}).exec()); 
     } 
     return saveTasksPromises; 

     }) 
     .then(function(data, err) { 
     console.log(data); 

     deferred.resolve(); 
     }); 

     return deferred.promise; 

    }// #stopUserTasks 
+0

[明示的な約束作成反パターン](http://stackoverflow.com/quエスポジション/ 23803743 /明白な約束 - 建設 - 反パターンと方法 - 私はそれを回避する)。あるタイプの約束(マングース)を別のもの(q)に変換する必要がある場合は、「Promise.resolve(otherPromise)」または「Q(otherPromise)」を使用します。 –

答えて

1

Model.save()戻り、実際に約束ので、あなたの行は次のように調整する必要がModel.save().exec()を記述するので、必要はありません:

saveTasksPromises.push(Task.save({'_id': element._id, 'isPerforming': false})) 

はまたQ.allを使用して、全体の機能は次のように考えられます。

function stopUserTasks(userid) { 
    var deferred = Q.defer(); 
    var promise = Task.find({'_creator': userid}).exec(); 

    promise 
    .then(function(data) { 
     var len = data.length; 
     var saveTasksPromises = []; 

     for(var i = len; i--;) { 
     saveTasksPromises.push(Task.save({'_id': data[i]._id, 'isPerforming': false})); 
     } 
     return Q.all(saveTasksPromises); 
    }) 
    .then(function(data) { 
     deferred.resolve(data); 
    }); 
    .catch(function(err) { 
     deferred.reject(err); 
    }); 
    return deferred.promise; 
} 
+0

これは機能しません。 '延期された'約束は解決されず、拒絶されません。コンソールでは、最初のdata._idだけが表示されます。もちろん、 'element._id'は' data [i] ._id'に置き換えてください。 – miuosh

+0

'Q.all'を実行した後、上記の編集された答えを確認してください。 –

+0

それはほとんど動作します。あなたの提案のおかげで、私はそれをどうやって行うのか、自分で判断します。これは、ループ内で 'saveTasksPromises.push(Task.save({'_ id':data [i]。id、 'isPerforming':false}));' 'var task = data [i];を変更するときに機能します。 task.isPerforming = false; saveTasksPromises.push(task.save()); ' – miuosh

関連する問題