我对我正在建造的Yeoman发电机的一部分感到沮丧。因为这是我的第一次,我毫不怀疑我错过了一些明显的东西,但现在就是这样。
简单地说,我正在尝试记录消息,Do Things™,然后仅在完成这些事情时再记录另一条消息。
以下是方法:
repos: function () {
var self = this;
this.log(highlightColour('Pulling down the repositories'));
// Skeleton
this.remote('user', 'skeleton', 'master', function(err, remote) {
if (!err) {
remote.bulkDirectory('.', self.destinationRoot());
} else {
self.log('\n');
self.log(alertColour('Failed to pull down Skeleton'));
repoErr = true;
}
});
//
// Three more near identical remote() tasks
//
if (!repoErr) {
self.log(successColour('Success!'));
self.log('\n');
} else {
self.log(alertColour('One or more repositories failed to download!'));
}
},
每个单独的remote()任务都运行正常,但是在文件复制发生之前,我得到了第一个和最后一个self.log()消息。这似乎微不足道,但我只是想在完成所有事情之后来成功。
例如,在终端中我看到:
拉下存储库
成功!
文件复制结果
应该是:
拉下存储库
文件复制结果
成功!
我认为这可能与在每个remote()任务结束时使用this.async()和done()有关,我试过了,但每当我这样做时,根本没有任何代码触发。
我甚至尝试将所有内容(包括消息)分解为单独的方法,但仍然没有运气。
这么简单的目标,但我没有想法!我很感激你的帮助!
编辑:如果您想知道,我知道这些消息是第一次发生的,因为有关文件冲突的任何警报都会在消息后显示:)
答案 0 :(得分:1)
这不是与Yeoman有关的问题。你有异步代码,但你正在处理它,就像它是同步的一样。
在此处发布的示例中,只需将日志记录作为this.remote
回调的一部分:
repos: function () {
var self = this;
this.log(highlightColour('Pulling down the repositories'));
// Skeleton
this.remote('user', 'skeleton', 'master', function(err, remote) {
if (!err) {
remote.bulkDirectory('.', self.destinationRoot());
self.log(successColour('Success!'));
self.log('\n');
} else {
self.log('\n');
self.log(alertColour('Failed to pull down Skeleton'));
self.log(alertColour('One or more repositories failed to download!'));
}
});
},
也许您的实际用例更复杂;在这种情况下,您可以使用async(或任何其他替代方案)之类的模块来处理更复杂的异步流。无论哪种方式,Yeoman都不提供帮助来处理异步代码,因为这是Node.js的基础。