2016-11-16 60 views
0

我正在MongoDB中使用猫鼬做一些操作。我想搜索用户创建的所有任务,然后将值isPerforming设置为false并保存。 文档说,猫鼬查询(与.exec()函数)是承诺。有很多任务,所以我想推动他们阵列和使用Q.all([...])并行保存操作。问题是当我试图做.push()。我的代码在第一次.push()操作后停止。 有没有其他方法可以做到这一点?将猫鼬查询(承诺)添加到数组并执行并行操作

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

请不要使用[explicit promise creation antipattern](http://stackoverflow.com/quale estions/23803743 /什么,是最明确的,承诺建设,反模式和如何-DO-I-避免-IT)。如果您必须将一种类型的承诺(猫鼬)转换为另一种(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}));'to'var task = data [i]; task.isPerforming = false; saveTasksPromises.push(task.save());' – miuosh