-
Notifications
You must be signed in to change notification settings - Fork 74
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Promise of vertx cannot call then twice or more. #587
Comments
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:
The text was updated successfully, but these errors were encountered: