承诺问题 - .then()没有被调用?

时间:2016-02-21 00:02:05

标签: node.js promise sequelize.js

我有两个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);
});

2 个答案:

答案 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完成之前解决。