Javascript : 从不等待 returns
Javascript : Never returns from await
我正在尝试使用 async/await,但是等待中没有 return。
这是带有 await 的异步函数。
async _checkEmailDuplication() {
try {
console.log('Check Email Duplication is called');
let 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');
return true;
}
}
catch (e) {
console.error('Check Email Call Error', e.message);
return true;
}
console.log('What happened?');
return true;
}
正在调用checkEmail函数,这里是检查Email函数定义
export type EmailCheckResponse = { ret?: number };
class Network {
constructor() {
this._network = NativeModules.NetworkService;
}
checkEmail = (email: string): Promise<EmailCheckResponse> => {
console.log('Network CheckEmail is called');
return this._network.checkEmail(email);
}
}
这是 react-native 模块并尝试使用来自 iOS 的 Nativemodules。
这里是 Objective-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: %d\n", response.ret);
}];
}
}
问题是调用checkEmail后卡住了。没有return.
日志说
2017-07-16 16:01:29.355 [info][tid:com.facebook.React.JavaScript] 检查电子邮件重复被调用
2017-07-16 16:01:29.356 [info][tid:com.facebook.React.JavaScript] Network CheckEmail 被调用
2017-07-16 16:01:29.364 [50446:3725293] 请求邮箱:xxx@xxx.com
2017-07-16 16:01:29.384 [50446:3725170] 电子邮件检查结果:0
似乎 Objective-C 模块已成功调用,但没有从中返回。调用 await checkEmail 后,没有任何反应。
有谁能告诉我我的代码有什么问题吗? =(
我可以从你的 React 本机模块实现中看到,你忘记调用对工作至关重要的 resolve
和 reject
方法承诺他们承诺的工作方式。
[client checkEmailWithRequest:request handler:^(EmailCheckResponse *response, NSError *error) {
NSLog(@"Email Check result: %d\n", response.ret);
if(response){
resolve(response);
}else{
reject(@"no_events", @"There were no events", error);
}
}
];
希望对您有所帮助。
我正在尝试使用 async/await,但是等待中没有 return。
这是带有 await 的异步函数。
async _checkEmailDuplication() {
try {
console.log('Check Email Duplication is called');
let 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');
return true;
}
}
catch (e) {
console.error('Check Email Call Error', e.message);
return true;
}
console.log('What happened?');
return true;
}
正在调用checkEmail函数,这里是检查Email函数定义
export type EmailCheckResponse = { ret?: number };
class Network {
constructor() {
this._network = NativeModules.NetworkService;
}
checkEmail = (email: string): Promise<EmailCheckResponse> => {
console.log('Network CheckEmail is called');
return this._network.checkEmail(email);
}
}
这是 react-native 模块并尝试使用来自 iOS 的 Nativemodules。
这里是 Objective-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: %d\n", response.ret);
}];
}
}
问题是调用checkEmail后卡住了。没有return.
日志说
2017-07-16 16:01:29.355 [info][tid:com.facebook.React.JavaScript] 检查电子邮件重复被调用 2017-07-16 16:01:29.356 [info][tid:com.facebook.React.JavaScript] Network CheckEmail 被调用 2017-07-16 16:01:29.364 [50446:3725293] 请求邮箱:xxx@xxx.com 2017-07-16 16:01:29.384 [50446:3725170] 电子邮件检查结果:0
似乎 Objective-C 模块已成功调用,但没有从中返回。调用 await checkEmail 后,没有任何反应。
有谁能告诉我我的代码有什么问题吗? =(
我可以从你的 React 本机模块实现中看到,你忘记调用对工作至关重要的 resolve
和 reject
方法承诺他们承诺的工作方式。
[client checkEmailWithRequest:request handler:^(EmailCheckResponse *response, NSError *error) {
NSLog(@"Email Check result: %d\n", response.ret);
if(response){
resolve(response);
}else{
reject(@"no_events", @"There were no events", error);
}
}
];
希望对您有所帮助。