Q.all和一系列的承诺似乎并没有工作

我试图用Q来做一些工作。 我循环并调用一个将数据保存到数据库并返回一个承诺的函数。 一旦完成,我需要做其他事情,但Q.all完成,但我可以看到每个解决scheme被调用。 我疯了,有什么想法?

设置:

// save the divisions and then do the division checks // data.divisions is an array of objects var promises = []; data.divisions.forEach(function(dd){ var d = new grpl.division.Division(dd), p = d.save(); promises.push(p); }); Q.all(promises) .then(function(){ // do some other stuff here // this never actually gets called }).fail(function(err){ cb(err); }).done(); 

这里是d.save()

 Division.prototype.save = function(){ var self = this d = Q.defer(); getPool().getConnection(function(err, db){ if(err){ d.reject(err); return false; } var fields = { division_id: self.division_id, season_id: self.season_id, title: self.title, cap: self.cap, display_order: self.display_order }; db.query("INSERT INTO division SET ? ON DUPLICATE KEY UPDATE ?", [fields, fields], function(err, result) { if(err){ d.reject(err); return false; } d.resolve(true);// this does get resolved for each division }); }); return d.promise; } 

我不知道什么是错,但它只是停下来,似乎并没有解决我的Q.all电话。

更新看起来,保存的初始调用将正常工作,但随后的保存调用似乎解决了与第一次调用相同的承诺。 我把保存代码的主体包装成一个variables函数,我从save和它的工作中调用,但是我不能100%确定为什么(当JS真的让我困惑时,原型inheritance是我的后备)。 任何解释或更好的方法来做到这一点?

 Division.prototype.save = function(){ var func = function(self){ var d = Q.defer(); d.promise.division_id = self.division_id; getPool().getConnection(function(err, db){ if(err){ d.reject(err); return false; } var fields = { division_id: self.division_id, season_id: self.season_id, title: self.title, cap: self.cap, display_order: self.display_order }; db.query("INSERT INTO division SET ? ON DUPLICATE KEY UPDATE ?", [fields, fields], function(err, result) { if(err){ d.reject(err); return false; } d.resolve(result); }); }); return d.promise; } return func(this); } 

好的,您的debugging意见解决了这个问题,并明确了我所缺less的。 这是一个令人难以置信的小错字,是我build议在代码上使用像JSHint之类的原因之一。

 Division.prototype.save = function(){ var self = this d = Q.defer(); 

你能看见它吗? 直到你的评论清楚地说明了哪里出了问题。

 Division.prototype.save = function(){ var self = this ^ d = Q.defer(); 

你错过了一个,所以d是一个全局variables,而不是在save范围内,所以每次调用.save() ,都要重写全局variables,而你所有的resolvereject尝试都将parsing同一个全局variables对于每个保存呼叫的对手。