Javascript:永远不会从等待返回
Posted
技术标签:
【中文标题】Javascript:永远不会从等待返回【英文标题】:Javascript : Never returns from await 【发布时间】:2017-07-16 07:21:36 【问题描述】:我正在尝试使用 async/await,但 await 没有返回。
这是带有 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 函数,这里是 checkEmail 函数定义
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 Native 模块的导出部分。
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后卡住了。没有回报。
日志说
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] 调用网络 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 后,没有任何反应。
有没有人知道我的代码有什么问题? =(
【问题讨论】:
【参考方案1】:我可以从您的 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);
];
希望对你有所帮助。
【讨论】:
太棒了!我没有 Objective-C 背景知识,这部分是我想知道的另一点。要补充的一件事。 reject(RCTPromiseRejectBlock) 现在接受 3 个参数。 更新了答案。如果它解决了您的问题,请接受答案。 刚刚做到了。我不习惯整体流程和 UI,只是找到了“答案”按钮。不管怎样,谢谢你的回答!! 顺便说一句,即使我添加了resolve/reject方法,checkEmail函数的返回值为null。你知道为什么吗?当我在Objective-C中检查response.ret值时,有一个有效的返回值,它被交给了resolve方法,但是在Javascript中调用checkEmail方法后,返回值为null。 "检查邮件返回值:null" 让我知道日志顺序。是“检查电子邮件返回值:null”日志是在“电子邮件检查结果:%d\n”本机日志之前还是之后发生的?以上是关于Javascript:永远不会从等待返回的主要内容,如果未能解决你的问题,请参考以下文章
等待 HttpClient.GetStreamAsync 永远等待[关闭]
排毒测试:跟踪导致测试框架永远等待的 Javascript 计时器
对 CancellationTokenSource.Cancel 的调用永远不会返回