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 本地模块实现中看到,您忘记调用 resolvereject 方法,这对于按照他们承诺的工作方式承诺工作至关重要。

[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 的调用永远不会返回

从 PHP 控制器使用 request.post() 调用 python 脚本永远不会返回。为啥?

从后台队列调用时,核心数据 NSManagedObjectContext 保存永远不会返回