2017-02-06 10 views
0

Node.jsで、NodeGitを使用します。私はthisと同様の機能をPOST Express.jsルートの中に使用しています。 history.on("commit", ...)を約束.done()関数が最初に呼び出されていないので、しかし、すべての "on"イベントがJS約束の中で呼び出された後に戻ります。

router.post('/getLog', function(req, res, next) { 
    var logData = []; 

    Git.Repository.open(path.join(repositories.mine.path)) 
     .then(function(repo) { 
      return { 
        endCommit: [ First commit object ], //Just a random commit object that has a "sha" inside 
        startCommit: [ Second commit object ] //Just a random commit object that has a "sha" inside 
       }; 
     }) 
     .then(function(range) { 
      // History returns an event. 

      var history = range.endCommit.history(Git.Revwalk.SORT.Time); 

      // History emits "commit" event for each commit in the branch's history 
      history.on("commit", function(commit) { 
       logData.push({ 
        commit: commit.sha(), 
        message: commit.message() 
       }); 

       if (commit.sha() == range.startCommit.sha()) { 
        console.log("---LOG CREATED---"); 
        history.end(); 
       } 
      }) 

      history.start(); 
     }) 
     .done(function() { 
      console.log("---RETURNING---"); 

      return res.json({ logData: logData }); 
     }); 
}); 

:このルートはendCommitstartCommit間のコミットを取得する必要があります。ログでは、私は以下を参照してください。

---RETURNING--- 
---LOG CREATED--- 

どのように私は、ログが作成された後にのみ返すことができますか?

は、しかし私は、この特定のケースでは、私はそれがイベントに基づいているので、私は履歴オブジェクトをpromisify ことができるか分からない、過去にこのような問題に出くわしました。

答えて

1

あなたが完了したら解決しなければならない約束でのイベント処理をラップし、それを返すことができます。

.then(function(range) { 
    // History returns an event. 

    var history = range.endCommit.history(Git.Revwalk.SORT.Time); 

    var commitPromise = new Promise(function(resolve, reject) { 
    // History emits "commit" event for each commit in the branch's history 
    history.on("commit", function(commit) { 
     logData.push({ 
     commit: commit.sha(), 
     message: commit.message() 
     }); 

     if (commit.sha() == range.startCommit.sha()) { 
     console.log("---LOG CREATED---"); 
     resolve(); // resolve the promise 
     history.end(); 
     } 
    }) 
    }); 

    history.start(); 

    return commitPromise; 
}) 

私はあなたがグローバルPromiseを持っていると仮定します。具体的な約束の実施を選択するのはあなた次第です。たとえば、bluebirdを使用します。

+0

ありがとうございました!あなたは私を正しい道に向かわせました。 'resolve()'は 'history.end()'の前に現れなければいけません。さもなければ、その行は決して実行されません。私はすでにあなたの便宜のために答えを変更しました。 – adelriosantiago

+1

@adelriosantiago 'resolve'が' history.end() 'の後に置かれても実行されないという唯一の理由は、後者がエラーを投げることです。考えられる問題を防ぐためにこれを見てください。 –

+0

あなたは正しいです、 'history.end()'は存在しません。私はそれを 'throw Git.Error.CODE.ITEROVER'と置き換えて解決しました:https://github.com/nodegit/nodegit/blob/a7bde084cdc3537dd30522bb8fa1e6f2ff724898/lib/revwalk.js#L81。 – adelriosantiago

関連する問題