2017-01-19 9 views
1

要求前に自分のアプリケーションが到達しようとしているサーバーに到達可能かどうかを確認したい(インターネットにアクセス可能な場合)かどうかを確認したい。反応ネイティブでサーバーに到達できるかどうかを確認する方法

私はFetch APIを使用していますが、今はよく機能するタイムアウトを使用していますが、私の質問はサーバーが到達可能かどうかを確認できる方法です。

all-reacheable npmパッケージを使用して試したところ、次のコードを追加しましたが、コールバック応答はありません。

isReachable([ 
    'http://aposddasd.com', 
    'http://google.com' 
], (err, reachable, host) => { 
    console.log('Server is' + reachable); //=> false 
    console.log('App log' + host); //=> 'http://aposddasd.com' 
}); 

あなたはこれを達成するための最良の方法は何かで私を助けることができますか?

+0

React Nativeでは、デバイス自身のHTTPレイヤーの抽象としてフェッチAPIのカスタム実装を使用するため、 'all-reachable'がReact Nativeで動作しない可能性があります。要求を行う前にホストが到達可能であることを確認する理由がありますか?フェッチと約束により、HTTPエラーの処理が非常に簡単になり、ユーザーにより良い体験が提供される可能性があります。 – edcs

+1

私のサーバーがダウンしている場合、Fetch APIは約120秒かかってエラーが発生しますので、すばやく探していますが、機能タイムアウトを追加しましたが、もっと良いオプションがあるかどうかを知りたい場合は –

答えて

5

あなたは解決するか、拒否する最初の約束を返しますPromise.race()を使用することができます - 彼らは実際にはかなり素晴らしいです!チェックアウトここドキュメント:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/race

ここで3msの後にタイムアウトにシンプルな機能だ - 5秒の遅延をシミュレートするhttpbinを使用しています:

const isAvailable =() => { 
    const timeout = new Promise((resolve, reject) => { 
     setTimeout(reject, 300, 'Request timed out'); 
    }); 

    const request = fetch('https://httpbin.org/delay/5'); 

    return Promise 
     .race([timeout, request]) 
     .then(response => alert('It worked :)')) 
     .catch(error => alert('It timed out :(')); 
} 

isAvailable(); 

チェックアウトはここにフィドル:https://jsfiddle.net/edcs/8Lcg8a8j/10/

+0

ここでもコンセプトはタイムアウトですか? –

+0

はい - 300ms後に拒絶される新しい約束をすると、 'fetch()'が約束を返すので、好きなだけ多くのフェッチを「レース」することができます。完了する最初の約束が解決されます。したがって、フェッチ前にタイムアウトの約束が拒否された場合、サーバーに到達できないとみなすことができます。 – edcs

1

私はそれのための機能があれば恐れています。しかし、Fetch APIをjavascriptのsetTimeout()に入れて、例えば20秒間与えることができます。 20秒で結果が得られない場合は、おそらくサーバーに到達できません。

setTimeout({ this.FetchData(); }, 20000); 
+0

今、それは動作します。答えをありがとう。 –

+0

@BhumitMehtaよろしいですか? – Ataomega

関連する問題