2016-11-21 69 views
-1
function saveReport(t) { 
    return new Promise((resolve, reject) => { 
     return new Models 
     .Cycle() 
     .fetchAll() 
     .then((cycles) => { 
      const promises = cycles.map(cycle => { 
      return ReportService 
       .getReportByOrgId(cycle.get('orgId'), cycle.id, undefined, t) 
       .then(content => { 
       let md5 = crypto.createHash('md5'); 
       let dayNo = parseInt(Date.now()/(1000 * 60 * 60 * 24), 10); 
       var id = md5.update(cycle.id + cycle.get('orgId') + 'requestRealTimeReport' + dayNo).digest('hex'); 
       return new Models 
        .Report() 
        .save({ 
        id: id, 
        statistics: JSON.stringify(content) 
        }, { 
        transacting: t, 
        insert: true 
        }) 
        .tap(report => { 
        resolve(report); 
        }) 
        .catch(console.error); 
       }) 
       .catch(console.error); 
      }); 
      return Promise.all(promises) 
     }); 
    }) 
    } 

    DbService 
    .Bookshelf 
    .transaction(saveReport) 
    .catch(console.error); 

當我刪除這部分代碼:書架長事務問題

.tap(report => { 
    resolve(report); 
}) 

它總是帶有一個長事務,我只是想知道這個.tap期間發生的事情()的東西它是如何防止事務來自長期交易。

+1

您可能還需要修改格式,以便代碼的末尾不是您問題的一部分 – Doug

+0

@Doug更新了問題。良好的捕獲 - 甚至沒有看到這一部分。 – nmagerko

回答

0

您的代碼的tap部分是解決您在事務回調的頂部聲明的bluebirdPromise

正如documentation所解釋的,您必須在此處理程序中返回Promise,以便Bookshelf/Knex知道您何時完成了應該在事務中執行的所有操作。請注意,當您的resolve a Promise時,您實質上是在說您的承諾中的代碼已成功完成其執行。因此,您正在移除的代碼塊是一個重要的代碼塊:事實上,事務處理程序是如何將控制權交還給Bookshelf的。刪除它使書架處於等待永遠不會發生的事情的狀態。

我還應該注意,您沒有reject請撥打catch的任何區塊。這樣做的結果將導致有問題的行爲,因爲如果在您指定的事務中存在錯誤,Bookshelf將再也不會將控制權交還給它。

閱讀關於藍鳥網站(或甚至MDN文檔)上的new Promise 可能會幫助您更好地瞭解他們在做什麼,如果我的解釋沒有幫助。