1
1

More than 1 year has passed since last update.

Node.jsでAPIを呼び出すときの同期処理のメモ

Posted at

毎回、同期処理で悩みます。

Promise とか async とか意味わからんし・・・。

用語の意味から混乱します。

同期処理は、最初のコードから次のコードへと順次処理(実行)されていくこと。
非同期処理は、ある処理が終了するのを待たずに、別の処理を実行すること。

 

今日は冷静になって、同期処理を研究してみました。
私はど素人なので、もっといい方法があれば教えてください。

APIを呼び出すときの同期処理の研究

利用API

気象庁のAPIからデータをとる事例でいろいろ試してみました。

こんなJSONファイル

{
"publishingOffice":"広島地方気象台",
"reportDatetime":"2022-07-09T21:27:00+09:00",
"targetArea":"広島県",
"headlineText":"",
"text":" 中国地方は、湿った空気の影響で概ね曇り、雨の降っている所があります。\n\n 9日夜の広島県は、低気圧や湿った空気の影響で曇り、雨の降る所がある見込みです。\n\n 10日は、湿った空気の影響で概ね曇るでしょう。"
}

require-promise モジュール

まず。require-promise モジュールを使ったケース

main.js
'use strict';
const request = require('request-promise');
let apiURL = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/340000.json";
    
let values = getData(apiURL);
console.log(values);

function getData(apiURL){
  return new Promise((resolve,reject) => {
      var options = {
        url: apiURL,
        method: 'GET',
        json: true
      }
  
      request(options).then(function (body) {
        let bodyStr = JSON.stringify(body); //JSON 文字列に変換
        let values = JSON.parse(bodyStr); //Parseする

        resolve(values);
      });    
    });
}

これの実行結果

Promise { <pending> }

当たり前ですね。
関数は同期処理をしてますが、
そもそも呼び出すところが同期処理されていません。

ここです。
関数getDataの処理が終わる前に先にconsole.log を実行しています。

main.js
let values = getData(apiURL);
console.log(values);

ここをこう変えてみると

main.js
getData(apiURL).then((values) => {
    console.log(values);
});

実行結果

{
  publishingOffice: '広島地方気象台',
  reportDatetime: '2022-07-09T21:27:00+09:00',
  targetArea: '広島県',
  headlineText: '',
  text: ' 中国地方は、湿った空気の影響で概ね曇り、雨の降っている所があります。\n' +
    '\n' +
    ' 9日夜の広島県は、低気圧や湿った空気の影響で曇り、雨の降る所がある見込みです。\n' +
    '\n' +
    ' 10日は、湿った空気の影響で概ね曇るでしょう。'
}

おお、同期されて、ちゃんとデータとれました。
 

Axiosモジュールを使う

先ほどの例では、getData関数が大掛かりなので、axiosモジュールを使えば、こうスリムになります。

main.js
'use strict';
const axios = require("axios");
let apiURL = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/340000.json";
    
getData(apiURL).then((values) => {
    console.log(values.data); //requireと違うのが values.dataとなるところ
});

async function getData(apiURL){    
  let values = await axios.get(apiURL);
  return(values);
}


axios は改めて調べると、便利ですね。

以上です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1