Axios: 複数のAPIリクエストを連結する
2023-09-30 09:46:21
質問
Google Maps APIからいくつかのAPIリクエストをチェーンする必要があり、Axiosでそれを行おうとしています。
以下は最初のリクエストで、componentWillMount()の中です。
axios.get('https://maps.googleapis.com/maps/api/geocode/json?&address=' + this.props.p1)
.then(response => this.setState({ p1Location: response.data })) }
2番目のリクエストはこちらです。
axios.get('https://maps.googleapis.com/maps/api/geocode/json?&address=' + this.props.p2)
.then(response => this.setState({ p2Location: response.data }))
次に、最初の2つが完了することに依存する3つ目の要求があります。
axios.get('https://maps.googleapis.com/maps/api/directions/json?origin=place_id:' + this.state.p1Location.results.place_id + '&destination=place_id:' + this.state.p2Location.results.place_id + '&key=' + 'API-KEY-HIDDEN')
.then(response => this.setState({ route: response.data }))
この3つの呼び出しをチェーンして、最初の2つの呼び出しの後に3つ目が起こるようにするにはどうすればよいでしょうか?
どのように解決するのですか?
まず最初に、これを
componentWillMount
の中に置いた方が良いでしょう。
componentDidMount
で、これらのリクエストが完了したら更新されるデフォルトのステートをいくつか用意しておくとよいでしょう。次に、追加の再レンダリングを引き起こす可能性があるため、書くsetStatesの数を制限したい場合、async/awaitを使用した解決策を紹介します。
async componentDidMount() {
// Make first two requests
const [firstResponse, secondResponse] = await Promise.all([
axios.get(`https://maps.googleapis.com/maps/api/geocode/json?&address=${this.props.p1}`),
axios.get(`https://maps.googleapis.com/maps/api/geocode/json?&address=${this.props.p2}`)
]);
// Make third request using responses from the first two
const thirdResponse = await axios.get('https://maps.googleapis.com/maps/api/directions/json?origin=place_id:' + firstResponse.data.results.place_id + '&destination=place_id:' + secondResponse.data.results.place_id + '&key=' + 'API-KEY-HIDDEN');
// Update state once with all 3 responses
this.setState({
p1Location: firstResponse.data,
p2Location: secondResponse.data,
route: thirdResponse.data,
});
}
関連
-
[解決済み】コンポーネントの定義に表示名がない react/display-name
-
[解決済み】ReactJS: マテリアルuiのブレークポイントについて
-
[解決済み】Warning.Itが表示されるのはなぜですか?Functions are not valid as a React child?
-
[解決済み] Webpack のコンパイルに失敗した
-
[解決済み] sh: react-scripts: npm start の実行後にコマンドが見つからない。
-
[解決済み] ReactJS - SCRIPT1010: 期待される識別子 - IE11 で本番ビルドが実行されない
-
[解決済み] は、gatsby-imageで動作する良いreactのカルーセルコンポーネントはありますか?[って聞かれます。]
-
[解決済み] Cross-envでyarnの実行時にenv変数が変更されない。
-
[解決済み] componentDidUpdate'メソッドはいつ使用するのですか?
-
[解決済み】axiosのすべてのリクエストにAuthorizationヘッダーを添付する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ngrokがReact devサーバーに接続しようとすると、無効なホストヘッダが表示される。
-
[解決済み] Next.jsでWebSocketを利用する
-
[解決済み] ReactJsのCreateClassは関数ではない
-
[解決済み] React + TypeScript のエラーです。この呼び出しにマッチするオーバーロードがありません
-
[解決済み] componentWillReceiveProps は名称が変更されました。
-
[解決済み] カスタマイズ素材UI チェックした場合としない場合の切り替え
-
[解決済み] ReactJS で inst.render が関数でないエラーが発生する
-
[解決済み] eslint: no-case-declaration - case ブロックで予期しない字句の宣言があった。
-
[解決済み] AxiosにCORSの問題が発生
-
[解決済み] Reactでグローバル変数を宣言する方法とは?