yeoman生成器:复制或模板dos'不能在异步回调内部工作
yeoman generator: copy or template doesn't work from inside async callback
在一个yeoman生成器中,我试图根据外部网络资源的状态进行条件复制。我的问题是,yeoman copy
命令(也就是src.copy
和template
)在异步回调(例如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'!),没有错误消息,只是没有创建文件(通常的文件创建消息也丢失了,这是正常工作命令的一个特征)。
使用call或apply向函数传递显式this引用并没有改变行为,也没有将this绑定到异步函数。
对这种行为的解释是什么?我如何以这种异步方式进行复制调用?
根据Eric MORAND的评论,我将把我找到的解决方案作为单独的答案发布,而不是编辑到原始帖子,希望它更容易找到:
我找到了一个解决方案,使用yeomanRunContext的async()函数。(请参阅此处的api文档)异步代码开头的以下行:
var done = this.async();
然后,在我想要运行复制之前,对done()
的调用使它的行为与最初预期的一样。
相关文章:
- 不能从angular2中的子组件指定父组件中的数组
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- 转义符不能与innerHTML一起使用
- JSON.parse没有'不能使用Javascript
- "此网站似乎使用滚动链接定位效果.这可能不能很好地与异步平移一起工作;
- 我很奇怪“异步”模块不能很好地工作
- yeoman生成器:复制或模板dos'不能在异步回调内部工作
- Flux/Alt-Basic异步示例抛出“;不能在调度的中间进行调度;
- 为什么流行的JavaScript运行时不能处理看起来像同步的异步脚本?
- 异步瀑布不能正确保存猫鼬
- POST请求在AJAX中不能异步工作
- JQuery.when()和then()不能处理异步事件
- $q不能异步工作
- 我不能停止异步
- 为什么Yeoman不能在exec方法后执行异步回调
- javascript的expect()不能在异步回调中工作
- 异步.每个不能设置头后已经设置
- Reactjs与Parse.com异步加载错误?不能访问对象
- Twitter typeahead.js process()调用不能异步工作