Open fantasy0v0 opened 2 years ago
then of io.reactiverse.es4x.Thenable Maybe should return new Future.
then of io.reactiverse.es4x.Thenable Maybe should return new Future.
I tried to modify it, but the problem was not simple.😣https://promisesaplus.com/#the-then-method
I try to implement this with native promises. I testing.
@Override
public Value then(Value onResolve, Value onReject) {
try {
return JavaScript.createPromise(context, (_resolve, _reject) -> {
Consumer<Object> onResolveNext = value -> {
if (value instanceof Value _value) {
if (JavaScript.isPromise(_value)) {
_value.invokeMember("then", _resolve, _reject);
} else {
_resolve.execute(value);
}
} else {
_resolve.execute(value);
}
};
Consumer<Object> onRejectNext = err -> {
if (err instanceof Value _value) {
if (JavaScript.isPromise(_value)) {
_value.invokeMember("then", _resolve, _reject);
} else {
_reject.execute(err);
}
} else {
_reject.execute(err);
}
};
future.onComplete(ar -> {
if (ar.succeeded()) {
T result = ar.result();
if (onResolve != null && onResolve.canExecute()) {
Value value = onResolve.execute(result);
onResolveNext.accept(value);
} else {
_resolve.execute(result);
}
} else {
Throwable cause = ar.cause();
if (onReject != null && onReject.canExecute()) {
Value value = onReject.execute(cause);
onRejectNext.accept(value);
} else {
_reject.execute(cause);
}
}
});
});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
JavaScript.createPromise implement:
public static Value createPromise(Context context, PromiseExecutor executor) throws IOException {
Value bindings = context.getBindings("js");
bindings.putMember("executor", executor);
try {
Source source = Source
.newBuilder("js", "new Promise(executor)", null)
.build();
return context.eval(source);
} finally {
bindings.removeMember("executor");
}
}
@fantasy0v0 yes, that is the vert.x behavior, JavaScript has a similar behavior:
let myPromise = new Promise(function(myResolve, myReject) {
myResolve('OK'); // when successful
myResolve('OK'); // when successful
});
// "Consuming Code" (Must wait for a fulfilled Promise)
myPromise.then(
function(value) { console.log(value); },
function(error) { console.log(error); }
);
With a small difference that calling multiple times will silently ignore the multiple calls. Let's update es4x to be like that, ignore the multiple calls.
code: index.js
error message: