我为Android构建了一个React本机NativeModule
,该Android带有我从JavaScript拨打的@ReactMethod
。
该方法启动了一项活动,在该活动中,用户可以做一些事情,然后返回React活动。检查活动结果后,我决定进行resolve
或reject
承诺。
但是promise.resolve(...)
或promise.reject(...)
在JS侧没有效果。我从来没有得到应许的结果。也许这与一些Thread
问题有关?或者,也许在React活动回到前景之前已解决诺言?
为什么promise.resolve()
不能解决JS侧的承诺?
这是我从JS
调用的方法 @ReactMethod
public void login(final String appClientID, final String appSecretID, final String appName, final String returnURLScheme, Promise promiseCallback) {
// Clear promise if there was a pending one
if (promise != null) {
promise.reject("Login error", "Pending promise found, so we reject it. Did you try to call login twice?");
promise = null;
}
// Get foreground activity
Activity mContext = getCurrentContext();
// Configure settings
OAuthLogin mOAuthLoginModule = OAuthLogin.getInstance();
mOAuthLoginModule.init(mContext, appClientID, appSecretID, appName);
// Start oauth login in a new activity
mOAuthLoginModule.startOauthLoginActivity(mContext, mOAuthLoginHandler);
// Store the promise to resolve later.
promise = promiseCallback;
// If i do here promise.resolve('authorized'); the promise works!
}
我正在将promise
对象存储在类中,以在活动完成后稍后解决或拒绝。但它不会通知JS侧。
这是用户完成登录时执行的活动回调。
public static void setUpCallback(final Context mContext) {
mOAuthLoginHandler = new OAuthLoginHandler() {
@Override
public void run(final boolean success) {
OAuthLogin mOAuthLoginModule = OAuthLogin.getInstance();
if (success) {
String accessToken = mOAuthLoginModule.getAccessToken(mContext);
promise.resolve(accessToken); // This does not work. JS promise is never resolved and goes to limbo
promise = null;
} else {
String errorCode = mOAuthLoginModule.getLastErrorCode(mContext).getCode();
String errorDesc = mOAuthLoginModule.getLastErrorDesc(mContext);
promise.reject("Oauth Login error code " + errorCode, errorDesc); // This does not work. JS promise is never rejected and goes to limbo
promise = null;
}
}
};
}
,所以我找到了一个解决方案。似乎问题与在恢复React本机活动之前被执行的Oauth处理程序有关。因此,我基本上检查了活动onResume()
方法中的结果并解决承诺。
您可以尝试实例一个包含您承诺的变量以及您需要在哪里使用它可以调用:
promiseCallback.invoke(<params>);