【问题标题】:Promise problems - .then() not getting called?承诺问题 - .then() 没有被调用?
【发布时间】:2016-06-02 12:28:54
【问题描述】:

我有两个需要按特定顺序运行的 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);
});

【问题讨论】:

    标签: node.js promise sequelize.js


    【解决方案1】:

    addTransaction() 永远不会解决它创建的承诺。您创建了一个外部承诺并返回它,但从不解决它。您至少必须为该回调声明一个 resolve 参数,然后在某处调用 resolve()

    但是,如果Transaction.create() 已经返回了一个承诺,那么您可以将addTransaction() 更改为:

    var fn = function addTransaction(transaction) {
         return Transaction.create(transaction, { fields: [ 'Id', 'Name' ]});
    };
    

    还不清楚为什么您使用相同的fn 来处理每个事务产生的transactions 数组和data 数组。从逻辑的角度来看,这似乎有点奇怪。您确定这是编写代码的正确方法吗?为了让我们帮助您设计这部分代码,您必须通过在第一个事务数组上调用fn 来解释更多关于您要完成的工作,然后再对结果进行解释。 .

    【讨论】:

    • 哦,这很好。传递给Promise 构造函数的函数必须至少接受resolve 参数。
    • 我尝试删除外部 Promise,但现在当它尝试创建模型时出现“非空违规”。 var fn = 代码来自另一个堆栈溢出答案:stackoverflow.com/questions/31413749/… by Benjamin Gruenbaum
    • @meanrims - 听起来您只是没有正确处理您的数据库。如果您可以在您的答案中添加正确的数据库操作顺序,我们可以轻松地帮助您使用 Promise 正确执行该操作,但我不知道您的数据库,因此无法帮助您修复原始数据库代码。本杰明的答案包含一个fn,它创建了一个承诺并解决了它,这是你的代码没有做的事情。但是,如果Transaction.create() 已经返回了自己的承诺,您可以返回(正如本杰明的回答所说)。
    • @meanrims - 而且,正如我的回答所说,您已经尝试在两个事务上运行相同的 fn 函数,然后是创建这些事务的结果,这看起来是错误的。在编码中很少有这样的事情是正确的。您可能需要备份大约 5 个步骤,并准确解释您要对数据库执行的操作,并描述您想要执行的操作的确切顺序和顺序。然后,我们可以通过承诺帮助您实现这一目标。
    • @jfriend00 db代码只是一个Sequelize模型定义,除了create()调用保存到db不需要其他代码
    【解决方案2】:

    我不确定这是否能完全解决您的问题,但我认为您缺少return

    ...
    return results.then(function() {
        console.log("Done?"); //not getting called
    });
    ...
    

    没有它,Model1.create 承诺将在 results 完成之前解决。

    【讨论】:

    • 我已经尝试过了,不幸的是它没有任何区别:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多