【问题标题】:Vala async closureVala 异步关闭
【发布时间】:2020-12-02 07:05:43
【问题描述】:

我正在尝试做一个异步闭包,因为我在里面调用了另一个异步函数。有些我正在尝试做这样的事情:

void connect_on_button_click () {
    some_button.connect (() => {
        var val = yield some_async_function ();
        // Do something with the value...
    });
}

但是 vala 编译器会报错。 所以目前我的解决方案是传递一个定义的异步函数,例如:

async void on_button_click () {
    var val = yield some_async_function ();
    // Do something with the value...
}

void connect_on_button_click () {
    some_button.connect (on_button_click);
}

但我想知道是否可以将闭包标记为异步,这样我就不必创建另一个函数?

【问题讨论】:

    标签: asynchronous closures gtk vala


    【解决方案1】:

    Async lambdas/closures/delegates 当前aren't supported

    但是,如果您上面的示例反映了您的实际用例,那么您实际上并不需要它们,您只需要使用 async_method.begin(…) form 来调用异步方法:

    void connect_on_button_click () {
        some_button.connect (() => {
            some_async_function.begin();
        });
    }
    

    【讨论】:

    • 实际上它并没有反映我的实际用例,因为我使用的是异步函数的返回值。我已经相应地更新了问题。由于 vala 不支持它,如果您对我的用例没有任何建议,我将接受它。
    • 在这种情况下(vala 是否支持异步 lambda 等),解决方案与上述基本相同,因为信号处理程序上下文也不是异步的。所以通常你需要一个额外的异步 on_button_click 方法/函数来进行你实际需要做的异步调用,并使用 begin 调用它。
    • 我明白你的意思。所以基本上信号不期望一个异步函数,所以传递一个并不能像我想的那样工作?尽管它似乎在我的用例中有效。
    • 差不多,是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2013-09-19
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多