Javascript Haxe宏-替换";功能“;加上;异步函数;
我希望在将Javascript Haxe宏-替换";功能“;加上;异步函数;,javascript,function,replace,macros,haxe,Javascript,Function,Replace,Macros,Haxe,我希望在将haxe转换为JavaScript时,将异步添加到其方法中。 我有Haxecode: @:expose class Main implements IAsync { static function main() { trace("test"); } static function testAwait() { return 1; } } 这个代码被转换成这样一个代码: . . . Main.test
haxe
转换为JavaScript
时,将异步添加到其方法中。
我有Haxe
code:
@:expose
class Main implements IAsync {
static function main() {
trace("test");
}
static function testAwait() {
return 1;
}
}
这个代码被转换成这样一个代码:
. . .
Main.testAwait = function() {
return Main.test();
};
. . .
我希望能够在这段代码中将函数
替换为异步函数
。
例如:
Main.testAwait = async function() {
return Main.test();
};
但对于示例代码宏,我只能更改方法的名称:
package haxe_test;
import haxe.macro.Expr;
import haxe.macro.Context;
using haxe.macro.Tools;
using haxe_test.AsyncBuilder;
class BuildHub {
macro static public function build():Array<Field> {
var fields = Context.getBuildFields();
var testFunc:Function = {
expr: macro return $v{1},
ret: null,
params: [],
args: []
};
fields.push({
name: "testAwait",
access: [Access.AStatic],
kind: FieldType.FFun(testFunc),
pos: Context.currentPos(),
});
return fields;
}
package-haxe\u测试;
导入haxe.macro.Expr;
导入haxe.macro.Context;
使用haxe.macro.Tools;
使用haxe_test.AsyncBuilder;
类BuildHub{
宏静态公共函数build():数组{
var fields=Context.getBuildFields();
var testFunc:函数={
expr:宏返回$v{1},
ret:null,
参数:[],
args:[]
};
推({
名称:“等待”,
access:[access.AStatic],
种类:FieldType.FFun(testFunc),
pos:Context.currentPos(),
});
返回字段;
}
如何将功能
替换为异步功能
?
UPD:我简化了代码。也许选项编译器或JSGenApi能帮我做些什么?我想你的一般选项是:
- 收集有关构建宏中异步类型/字段的信息,然后在
中使用该信息修改输出文件。由于haxe代码是一致缩进的,因此可以使用两个正则表达式(我曾经制作了一个宏,通过这种方式将输出文件拆分为多个包文件)haxe.macro.Context.onAfterGenerate
- 对
稍作修改,将haxe.macro.ExampleJSGenerator
放在感兴趣的方法声明之前。由于不需要对表达式打印进行任何更改,因此这也非常简单async
class Test {
static function main() {
var value = await( async(testAsync) );
trace(value);
}
static function testAsync() return 1;
static inline function await<T>(fn:Void->Void):T {
return js.Syntax.code("await {0}()", fn);
}
static inline function async<T>(fn:Void->Void):T {
return js.Syntax.code("async () => {0}()", fn);
}
}
类测试{
静态函数main(){
var值=等待(异步(testAsync));
跟踪(值);
}
静态函数testAsync()返回1;
静态内联函数等待(fn:Void->Void):T{
返回js.Syntax.code(“wait{0}()”,fn);
}
静态内联函数异步(fn:Void->Void):T{
返回js.Syntax.code(“async()=>{0}()”,fn);
}
}
或者同时执行这两项操作:
class Test {
static function main() {
var value = asyncAwait( testAsync );
trace(value);
}
static function testAsync() return 1;
static inline function asyncAwait<T>(fn:Void->Void):T {
return js.Syntax.code("(async () => { await {0}() })()", fn);
}
}
类测试{
静态函数main(){
var值=异步等待(testAsync);
跟踪(值);
}
静态函数testAsync()返回1;
静态内联函数AsyncWait(fn:Void->Void):T{
返回js.Syntax.code(((async()=>{await{0}()})(),fn);
}
}
异步被添加到其方法中为什么?不是所有函数都需要异步
。或者@:async
标签是如何标记异步函数的?我很惊讶haxe还不支持async/await-它曾经是一种很好的语言刚刚发现-这有用吗?@JaromandaX我在示例中简化了代码,不适合,因为我有很多遗留代码:(我认为您可以在创建字段时向字段添加元数据,然后添加自己的js gen实现来截取并生成适当的代码,从而实现您想要的功能。