gpt4 book ai didi

node.js - 问:所有的 promise 和一系列的 promise 似乎都不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:52 25 4
gpt4 key购买 nike

我正在尝试使用 Q 来做一些工作。我循环并调用一个函数,该函数将数据保存到数据库并返回一个 promise 。一旦完成这些,我需要做其他事情,但 Q.all 完成,尽管我可以看到每个解析被调用。我快疯了,有什么想法吗?

设置:

// 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 调用。

更新看起来对 save 的初始调用将正常运行,但后续的 save 调用似乎正在解决与第一次调用相同的 promise 。我将保存代码的主体包装到一个变量函数中,我从 save 中调用了该函数及其工作原理,但我不能 100% 确定原因(每当 JS 真正让我困惑时,原型(prototype)继承就是我的后备方案)。有什么解释或更好的方法吗?

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);
}

最佳答案

好的,您的调试评论解决了问题并清楚地表明了我所缺少的内容。这是一个非常小的拼写错误,也是我建议在代码中使用 JSHint 等内容的原因之一。

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

你能看到吗?直到你的评论清楚地表明出了什么问题,我才意识到。

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

您缺少 ,,因此 d 是一个全局变量,而不是在 save 内作用域,因此每次调用 .save() 时,您都会重写全局变量,并且所有 resolvereject 尝试都将解析相同的全局变量,而不是每次保存调用的延迟解析。

关于node.js - 问:所有的 promise 和一系列的 promise 似乎都不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com