yeoman生成器:复制或模板不能从异步回调内部工作

时间:2014-10-22 13:00:58

标签: javascript node.js asynchronous yeoman yeoman-generator

在yeoman生成器中,我尝试根据外部网络资源的状态进行条件复制。我的问题是yeoman copy命令(src.copytemplate也是如此)在异步回调中调用时似乎没有做任何事情,例如来自http请求的回调

示例代码,位于yeoman.generators.NamedBase.extend块内:

main: function(){  
//-> here this.copy('inlocation','outlocation') works as expected
var that = this;

var appName = ...
var url = ...

var req = http.request(url, function(res){
//-> here that.copy('inlocation','outlocation') DOES NOT work
    res.on('data', function (data) {
        //console.log('Response received, onData event');
        //-> here that.copy('inlocation','outlocation') DOES NOT work
    });
    //-> here that.copy('inlocation','outlocation') DOES NOT work
});
req.on('error',function(error){
    //...
});
req.end();
//-> here this.copy('inlocation','outlocation') works as expected, once again

注意标有' // - >'的位置对参考点的评论 - 当它起作用时,它按预期工作。如果它没有,那么控制台上没有任何输出(因此,copy似乎作为一个函数存在,实际上我可以断言那种类型的.copy ===' function&#39 ;!),没有错误消息,只是没有创建文件(通常的文件创建消息也缺失,这是正常工作命令的特征)。

使用call或apply传递一个显式的对函数的引用没有改变行为,也没有将 this 绑定到异步函数。

此行为的解释是什么,以及如何以此异步方式进行复制调用?

1 个答案:

答案 0 :(得分:0)

根据Eric MORAND的评论,我会将我发现的解决方案发布为单独的答案,而不是对原始帖子进行编辑,希望它更容易找到:

我找到了一个解决方案,使用了yeoman RunContext的async()函数。 (请参阅api文档here)异步代码开头的以下行:

var done = this.async();

然后在我想要运行副本之前调用done()使其行为符合最初的预期。