2017-07-07 73 views
0

我想弄清楚为什么我的承诺链执行失序,尽管写了一个非嵌套的然后链。我的函数已被模块化,以减少将在我的链中发生的代码膨胀(我期望有五个方法),我不确定这些模块中的某些内容是否导致顺序跳转,或者是由于我的总体承诺结构。Javascript Modularized Promise Chain Out of Order

这里是终端输出:

Executing (a6bf615e-5497-47b2-8aea-3f7d70927cba): START TRANSACTION; 
Executing (a6bf615e-5497-47b2-8aea-3f7d70927cba): SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
Step 1: Document Find 
Step 3: Cancel Stripe Subscription 
string //console.log(typeof subscriptionId); 
sub_jsdfjsdfjdsfjsdfj //console.log(subscriptionId) 
Executing (a6bf615e-5497-47b2-8aea-3f7d70927cba): SELECT .... 
Step 2: Set Array 
[ 13, 14 ] //console.log(documentArr); 
undefined //console.log(canceledStripeAccount); 
undefined //console.log(canceledAt) 

这是我的承诺结构:

var sequelize = require('sequelize'); 
var models = require('../../../models/db-index'); 
var deleteAccount = require('./delete-account'); 


//DELETE /settings/account 
exports.delete = function(req, res){ 
    var documents; 
    var documentArr; 
    var canceledStripeAccount; 
    var canceledAt; 

    return models.sequelize.transaction().then(function(t){ 

     return deleteAccount.queryAllDocuments(req.session.organizationId, t) 
     .then(function(_document){ 
       console.log("Step 2: Set Array"); 
       documentArr = _document; 
       console.log(documentArr); 
     }) 
     .then(deleteAccount.cancelStripeAccount(req.session.subscriptionId, canceledStripeAccount, canceledAt)) 
     .then(function(canceledStripeAccount){ 
      console.log(canceledStripeAccount); 
      console.log(canceledAt) 
     }); 
    }); 
}; 

模块文件:

var models = require('../../../models/db-index'); 
var components = require('./components'); 
var stripe = require('stripe')(process.env.STRIPE_API_KEY); 

module.exports = { 

    queryAllDocuments: function(organization, t){ 
     console.log("Step 1: Document Find"); 
     return models.Document.findAll({ 
      include: [{ 
       model: models.User, 
       include: [{ 
        model: models.Organization, 
        where: { 
         organizationId: organization 
        } 
       }] 
      }], 
      transaction: t 
     }) 
    }, 

    cancelStripeAccount: function(subscriptionId, canceledStripeAccount, canceledAt){ 
     console.log("Step 3: Cancel Stripe Subscription"); 
     console.log(typeof subscriptionId); 
     console.log(subscriptionId) 
     return stripe.subscriptions.del(subscriptionId).then(function(_canceledStripeAccount){ 
      return canceledStripeAccount = _canceledStripeAccount; 
      //canceledAt = canceledStripeAccount.canceled_at; 
     }) 
    } 

} 
+0

也许无关,但'components'没有在'then'处理程序中定义 – MinusFour

+0

感谢您的渔获物,其实我删除的功能,清理的问题的代码。与我面临的问题无关。 – cphill

回答

2

您调用的函数,直接之前.then()甚至将其回调(并从经过的返回值来.then()):

.then(deleteAccount.cancelStripeAccount(req.session.subscriptionId, 
     canceledStripeAccount, canceledAt)) 

相反,.then()应传递一个函数引用,因此它可以晚些时候调用该函数:

.then(() => deleteAccount.cancelStripeAccount(req.session.subscriptionId, 
       canceledStripeAccount, canceledAt)) 
+0

谢谢你的回答,我是否正确地说过在调用deleteAccount之前,前一个'then()'函数没有地方返回回调对象,这就是为什么它会跳转顺序?我也很抱歉,我现在还不熟悉es6,所以es5等价物在'deleteAccount'之前是'function(obj){}'? '。然后(函数(){},deleteAccount ...)'? – cphill