2017-07-07 83 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