2016-11-21 9 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はトランザクション内のすべての処理を完了したことを知ることができます。 resolvePromiseの場合、本質的には、約束のコードが正常に実行されたと言います。したがって、削除しているコードブロックは重要です。つまり、トランザクションハンドラがコントロールをブックシェルフに戻す方法です。それを削除すると、Bookshelfは決して起こらないことを待っている状態になります。

catchブロックのいずれかにrejectコールがないことにも注意してください。 Bookshelfは、指定したトランザクションにエラーが発生した場合、再び制御が渡されることはありません。これにより、問題が発生します。

ブルーバードサイト(またはMDNドキュメント)のnew Promise については、私の説明が役に立たなかった場合、彼らが何をしているかを知るのに役立ちます。

関連する問題