使用 Promise 将 Objective-C 导出(桥接)方法导出(桥接)到 React native:仅返回 nu



我正在尝试使用 Promise 将 objective-c 方法导出到 react-native 中,但是当我在 react-native 检查返回值时,它总是为 null,即使 objective-c 返回正确的数据也是如此。

这是我的目标-c方法。

RCT_EXPORT_METHOD(checkEmail:(NSString *)email 
resolver:(RCTPromiseResolveBlock)resolve 
rejecter:(RCTPromiseRejectBlock)reject)
{
@autoreleasepool {
[GRPCCall useInsecureConnectionsForHost:kHostAddress];
AccountService *client = [[AccountService alloc] initWithHost:kHostAddress];
EmailCheckRequest *request = [EmailCheckRequest message];
request.email = email;
NSLog(@"Requested Email: %@n", request.email);
[client checkEmailWithRequest:request handler:^(EmailCheckResponse *response, NSError *error) {
NSLog(@"Email Check result: %dn", response.ret);
if (response) {
NSLog(@"Resolved responsen");
resolve(response);
}
else {
NSLog(@"Rejected responsen");
reject(@"no_events", @"There was no event", error);
}
}];
}
}

反应原生端方法的定义是这样的。

checkEmail = (email:string) => {
console.log('Network Check Email is called');
return this._network.checkEmail(email);
}

checkEmail = (email:string) => {
return new Promise((resolve, reject) => {
console.log('Network Check Email is called');
this._network.checkEmail(email).then((res) => {
console.log('check email result: ' + res);
resolve(res);
});
});
}

我测试了这两种情况,但 checkEmail 的返回值始终为Null

async _checkEmailDuplication() {
try {
console.log('Check Email Duplication is called');
const res = await MyNetwork.checkEmail(this.state.email);
console.log('Check email return value: ' + res);
if (res === 0) {
console.log('Available Email');
return false;
}
else {
console.log('Email Duplication Check Error');
this.state.errMsg = WSStrings.errCodes[res];
return true;
}
}
catch (e) {
console.error('Check Email Call Error', e.message);
this.state.errMsg = e.message;
return true;
}
}

下面是我运行上述代码时来自 Xcode 的日志。

2017-07-18 00:51:43.781 [info][tid:com.facebook.React.JavaScript] Check Email Duplication is called
2017-07-18 00:51:43.782 [info][tid:com.facebook.React.JavaScript] Network Check Email is called
2017-07-18 00:51:43.839 [5782:110747] Requested Email: xxx@xxx.com
2017-07-18 00:51:43.872 [5782:109339] Email Check result: 2
2017-07-18 00:51:43.872 [5782:109339] Resolved response
2017-07-18 00:51:43.873 [info][tid:com.facebook.React.JavaScript] check email result: null
2017-07-18 00:51:43.874 [info][tid:com.facebook.React.JavaScript] Check email return value: null
2017-07-18 00:51:43.874 [info][tid:com.facebook.React.JavaScript] Email Duplication Check Error

它没有获得正确的返回代码,而只是NULL,无法进入下一步。

Objective-C代码或反应原生代码是否有任何语法错误?

我没有 Objective-C 背景知识,也没有足够的 Promise 和 react-native 桥梁经验,所以如果有人可以帮助我,我们将不胜感激。

终于,我找到了答案。resolve(response)这部分是问题所在。

响应对象不是由Javascript端解释的,所以不得不像这样交出NSDictionary对象,而不是交出响应对象本身。

if (response) {
NSLog(@"User ID: %d Language: %@n", response.uid, response.language);
NSDictionary *dictRes = @{
@"ret":@(response.ret),
@"uid":@(response.uid),
@"lang":response.language
};
resolve(dictRes);
}

无论如何,这是Objective-C的附带问题,而不是Javascript。

问题解决了!!

最新更新