2017-07-16 57 views
1

我試圖使用async/await,但是沒有從等待中返回。Javascript:永遠不會從等待中返回

這是等待異步功能。

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功能,這裏是檢查電子郵件功能定義

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); 
    } 
} 

這是反應,本機模塊,並試圖用Nativemodules從iOS版。

這裏是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後,它卡住了。沒有回報。

日誌說

2017年7月16日16:01:29.355 [信息] [TID:com.facebook.React.JavaScript]檢查電子郵件複製被稱爲 2017年7月16日16:01: 29.356 [信息] [TID:com.facebook.React.JavaScript]網絡CheckEmail被稱爲 2017年7月16日16:01:29.364 [50446:3725293]請求的電子郵件:[email protected] 2017年7月16日16 :01:29.384 [50446:3725170]電子郵件檢查結果:0

看來,Objective-C的模塊被成功調用,但沒有從未來回來。在調用await checkEmail之後,沒有任何反應。

是否有任何人誰可以告訴什麼是錯我的代碼? =(

回答

0

我可以看到你的陣營本機模塊實現,你忘了打電話給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); 
     } 
} 
]; 

希望這有助於你。

+0

真棒!我沒有Objective-C的背景知識,這部分是我想知道的另一點。 有一點要補充。拒絕(RCTPromiseRejectBlock)現在需要3個參數。 – Spike

+0

更新了答案。如果它解決您的問題,請接受答案WER。 – yaswanthsvist

+0

剛剛做到了。我不習慣整體流程和用戶界面,只是找到了「答案」按鈕。無論如何,謝謝你的回答! – Spike

相關問題