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.macro.Context.onAfterGenerate
    中使用该信息修改输出文件。由于haxe代码是一致缩进的,因此可以使用两个正则表达式(我曾经制作了一个宏,通过这种方式将输出文件拆分为多个包文件)
  • haxe.macro.ExampleJSGenerator
    稍作修改,将
    async
    放在感兴趣的方法声明之前。由于不需要对表达式打印进行任何更改,因此这也非常简单

不确定您是否考虑过更简单的方法,但在Haxe 4中,您可以这样做:

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实现来截取并生成适当的代码,从而实现您想要的功能。