Console.log未显示在节点Promise的第二层中

时间:2018-11-22 11:13:36

标签: javascript node.js nodegit

我正在使用nodegit基于git commits创建一个自定义的CHANGELOG生成器(我不太喜欢现有的类似项目,至少从理论上讲,它是一个非常简单的工具)。

我现在的问题是,当它位于promise的第二层时,我似乎无法console.log来显示任何输出。

此代码显示了第一个console.log条目,但第二个则消失在网络空间中。它不会显示任何错误或任何内容,只是不会出现在控制台中。

git.Repository.open(repo_root).then(function (repo_handle) {
  repo_handle.Tag.list(repo_handle).then(function (tag_list) {
    console.log("THIS SHOWS"); // <--- Shows
    repo_handle.getTagByName(tag_list[0]).then(function (tag) {
      console.log("THIS DOES NOT"); // <--- Doesn't show
    });
  });
});

仅是为了验证问题不在getTagByName函数中,下面的代码可以正常工作并输出THIS SHOWS,所以这与将日志记录功能放到第二层中有关。诺言。

git.Repository.open(repo_root).then(function (repo_handle) {
  repo_handle.getTagByName('v0.0.1').then(function (tag) {
    console.log("THIS SHOWS");
  });
});

我已经尝试了相同代码的几个不同版本,例如使用return repo_handle.Tag.list(repo_handle)then(tag_list),但结果相同。

据我所知代码实际上没有任何错误或任何东西,该代码似乎可以正常工作,因为我没有任何错误,但是如果console.log仍然没有工作,正确的话,可能就是没有向我显示错误...

1 个答案:

答案 0 :(得分:2)

这可能意味着repo_handle.getTagByName('v0.0.1').then(function (tag) {永远不会开始。尝试这样的事情:

git.Repository.open(repo_root).then(function (repo_handle) {
    repo_handle.Tag.list(repo_handle).then(function (tag_list) {
        console.log("THIS SHOWS"); // <--- Shows
        repo_handle.getTagByName(tag_list[0]).then(function (tag) {
            console.log("THIS DOES NOT"); // <--- Doesn't show
        }).catch(error => {
            console.log("gotcha! ", error);
        });
    });
});

console.log本身与承诺嵌套的深度无关

从更新者更新

对于后来发现此问题的人,实际的问题原来是repo_handle.Tag未定义,而我发现此问题的原因是为错误添加了catch,因此接受了这个答案。

有效的新更新代码如下:

let nodegit = require('nodegit');
let path = require('path');

var repo_root = path.resolve(__dirname, './.git');
let repo = null;

nodegit.Repository.open(repo_root)
  .then(function (repo_handle) {
    repo = repo_handle;
    return nodegit.Tag.list(repo_handle);
  })
  .then(function (tag_list) {
    return repo.getTagByName(tag_list[0]);
  })
  .then(function (tag) {
    console.log(tag.message());
  })
  .catch(function (e) {
    console.error(e);
  });