毎回、同期処理で悩みます。
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 は改めて調べると、便利ですね。
以上です。