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 });
});
});
:このルートはendCommitとstartCommit間のコミットを取得する必要があります。ログでは、私は以下を参照してください。
---RETURNING---
---LOG CREATED---
どのように私は、ログが作成された後にのみ返すことができますか?
は、しかし私は、この特定のケースでは、私はそれがイベントに基づいているので、私は履歴オブジェクトをpromisify ことができるか分からない、過去にこのような問題に出くわしました。
ありがとうございました!あなたは私を正しい道に向かわせました。 'resolve()'は 'history.end()'の前に現れなければいけません。さもなければ、その行は決して実行されません。私はすでにあなたの便宜のために答えを変更しました。 – adelriosantiago
@adelriosantiago 'resolve'が' history.end() 'の後に置かれても実行されないという唯一の理由は、後者がエラーを投げることです。考えられる問題を防ぐためにこれを見てください。 –
あなたは正しいです、 'history.end()'は存在しません。私はそれを 'throw Git.Error.CODE.ITEROVER'と置き換えて解決しました:https://github.com/nodegit/nodegit/blob/a7bde084cdc3537dd30522bb8fa1e6f2ff724898/lib/revwalk.js#L81。 – adelriosantiago