Console.log 未在第二层节点承诺中显示
Console.log not showing in second layer of node promise
我正在创建一个基于 git 使用 nodegit 提交的自定义 CHANGELOG 生成器(我不太喜欢现有的类似项目,理论上它是一个非常简单的工具至少)。
我现在的问题是,我似乎无法让 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
没有不能正常工作,那么它可能只是没有向我显示错误...
这可能意味着 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本身与promise嵌套的深度无关
来自提问者的更新
对于那些后来发现的人来说,实际问题原来是 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);
});
我正在创建一个基于 git 使用 nodegit 提交的自定义 CHANGELOG 生成器(我不太喜欢现有的类似项目,理论上它是一个非常简单的工具至少)。
我现在的问题是,我似乎无法让 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
没有不能正常工作,那么它可能只是没有向我显示错误...
这可能意味着 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本身与promise嵌套的深度无关
来自提问者的更新
对于那些后来发现的人来说,实际问题原来是 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);
});