我有两个Sequelize查询需要按特定顺序运行,第一个创建模型,第二个从数组创建多个模型。它的工作原理是首先插入obj1
然后插入事务数组,但是最后的'then()'似乎没有被调用......我做错了什么?
var fn = function addTransaction(transaction) {
return new Promise(function() {
return Transaction.create(transaction, { fields: [ 'Id', 'Name' ]});
}
};
var transactions = [...]; //array of transaction objects
Model1.create(obj1, { fields: [ 'Id', 'Name' ,'Description' ]}).then(function() {
var actions = transactions.map(fn);
var results = Promise.all(actions).then(function(data) {
return Promise.all(data.map(fn));
});
results.then(function() {
console.log("Done?"); //not getting called
});
}).catch(function(err) {
console.log(err);
});
答案 0 :(得分:2)
addTransaction()
永远不会解决它创造的承诺。您创建一个外部承诺并将其返回,但永远不会解决它。您至少必须为该回调声明resolve
参数,然后在某处调用resolve()
。
但是,如果Transaction.create()
已经返回承诺,那么您可以将addTransaction()
更改为:
var fn = function addTransaction(transaction) {
return Transaction.create(transaction, { fields: [ 'Id', 'Name' ]});
};
还不清楚为什么您使用相同的fn
来处理每个事务产生的transactions
数组和data
数组。从逻辑的角度来看,这似乎有点奇怪。您确定这是编写代码的正确方法吗?为了帮助您设计代码的这一部分,您必须通过在第一个事务数组上调用fn
来解释更多关于您尝试完成的事情的内容,然后再次根据结果。
答案 1 :(得分:0)
我不确定这是否能完全解决您的问题,但我认为您错过了compatible = ObjectSpace.each_object(Class).find do |o|
o.name == "Rational::compatible"
end
p compatible
# => Rational::compatible
p compatible.instance_methods(false)
# => []
p compatible.private_instance_methods(false)
# => [:marshal_load]
:
return
如果没有它,...
return results.then(function() {
console.log("Done?"); //not getting called
});
...
承诺将在Model1.create
完成之前解决。