2

在 Node.js 中,使用 NodeGit。我在POST Express.js 路由中使用了与此类似的函数。这条路线应该得到endCommitstartCommit之间的提交:

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 });
        });
});

但是,由于history.on("commit", ...)不是 Promise,因此.done()首先调用该函数。在日志中我看到:

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

只有在创建日志后才能返回?

我过去曾遇到过这样的问题,但是在这种特殊情况下,我不知道如何承诺历史对象,因为它是基于事件的。

4

1 回答 1

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全球性的。这取决于您选择特定的 Promise 实现 - 例如,您可能想要使用bluebird

于 2017-02-06T06:40:43.090 回答