Here's the minimal snippet of code to reproduce the problem I'm struggling with:
import java.util.function.Consumer;
public class NaivePromise<T> {
public NaivePromise(Consumer<Consumer<T>> resolve) {
super();
create(resolve);
}
public native NaivePromise<T> create(Consumer<Consumer<T>> handler) /*-{
return new Promise(function (resolve) {
console.log("DBG NATIVE RESOLVE");
[email protected]::accept(*)(resolve)
});
}-*/;
public static void pong() {
new NaivePromise<String>(resolve -> {
resolve.accept("HERE WE'LL GET AN ERROR, SINCE RESOLVE IS ACTUALLY A NATIVE FUNCTION");
});
}
}
My question would be - how can I execute native functions passed as lambdas to GWT Consumer (or any other functional interface)?
You'd have to make resolve
a JavaScriptObject
rather than a Consumer<String>
, and use JSNI to call it:
private native void call(JavaScriptObject resolve, String arg) /*-{
resolve(arg);
}-*/;
Though you actually really should use JsInterop here, with a @JsFunction
interface; and probably actually just use Elemental 2's mapping of Promise
.