2017-07-17 4 views
1

プロミスとのネイティブ反応を行うためにobjective-cメソッドをエクスポートしようとしていますが、 objective-cが正しいデータを返すにもかかわらず、常にnullです。Objective-CからPromiseへのネイティブReactへの(bridging)メソッドのエクスポート:nullを返す

ここに私の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); 
      if (response) { 
       NSLog(@"Resolved response\n"); 
       resolve(response); 
      } 
      else { 
       NSLog(@"Rejected response\n"); 
       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の戻り値は常にヌルです。

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: [email protected] 
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の背景知識がなく、プロミスと反応ネイティブの橋で十分な経験がないので、誰かが助けてくれればそれは高く評価されます。

答えて

1

最後に、私は答えを見つけました。 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); 
      } 

とにかく、それはJavascriptではなくObjective-C側の問題でした。

問題が解決しました。

関連する問題