functionの戻り値について

お世話になっております。

ゼンリンいつもNAVIというマップシステムを使用して、緯度経度から最寄り駅を検索するというコードを記載しております。

コードは以下の通りです。

====================================================

//####################################################

// 地図をロード
//####################################################
function loadMap(){
// document.write を定義します
var nativeWrite = document.write;
document.write = function(html) {
var m = html.match(/script.+src=“([^”]+)"/);
if (m) { load(m[1]);}
else { nativeWrite(html); }
};

load(“[https://api.its-mo.com/cgi/loader.cgi?key=\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*&ver=2.0&api=zdcmap.js,control.js,submap.js,shape.js,geo.js,userwidget.js,search.js,geojson-1.0.js](https://api.its-mo.com/cgi/loader.cgi?key= **************** &ver=2.0&api=zdcmap.js,control.js,submap.js,shape.js,geo.js,userwidget.js,search.js,geojson-1.0.js)”);

}

//####################################################
// 地図がロードされるまで待機する(詳細画面)
//####################################################
function waitLoaded_detail(event, mode, timeout, interval) {
setTimeout(function() {
var remainingTime = timeout - interval;
if (typeof ZDC === ‘object’) {

// console.log(mode);

// 詳細画面の場合
return setLocationDetail(event);

} else if (timeout > 0) {
waitLoaded_detail(event, mode, timeout, interval);
} else {
//abort
}
}, interval);
}

//####################################################
// 最寄り駅検索
//####################################################
function setLocationDetail(event) {

// レコード情報を取得します
var rec = event[‘record’];

// 緯度・経度が入力されていれば、緯度・経度から最寄り駅を算出します
if (rec[‘lat’][‘value’] || rec[‘lng’][‘value’]){

/* 検索地点の緯度経度 */
var point = new ZDC.LatLon(rec[‘lat’][‘value’], rec[‘lng’][‘value’]);

/* 周辺の駅検索を実行 */
ZDC.Search.getStationByLatLon({
latlon: point
},function(status, res) {

if (status.code == ‘000’) {
/* 取得成功 */
nearest_station(status, res);
console.log(“取得成功”);
} else {
/* 取得失敗 */
alert(status.text);
console.log(“取得失敗”);
}
});

function nearest_station(status, res) {

var ns_item = res.item;
var ns_res = “”;

console.log(“ヒット数:” + ns_item.length);

for (var i = 0, j = ns_item.length; i<j; i++) {

ns_res += ns_item[i].poi.text + " (" + ns_item[i].distance + “m)” + “”;

}

console.log(ns_res);
return ns_res;

}
}
}

//マップロード
loadMap();
var app = waitLoaded_detail(event, ‘index’, 10000, 100);

console.log(app);

====================================================

上記のコードでは①マップを読みこみ⇒②読みこみができていれば最寄り駅検索という内容になっています。

「console.log(ns_res);」で希望の検索内容は取得できているのですが、

「console.log(app);」ではundefinedと表示されます。

 

functionで得た結果(値)をその後の処理にもっていくにはどうすればよろしいのでしょうか?

初歩的な質問で申し訳ございませんが、ご教授いただけますと有難いです。

y-kishi さん

waitLoaded_detail は、非同期処理ですので Promise を使ってはいかがですか?

kintone.Promiseの書き方・使い方~超入門編~

関数で Promise を使ったサンプル例が少ないのですが、下記が参考になると思います。

kintone ファイルのダウンロードとアップロード

rex0220 様

 

ご回答ありがとうございます。

kintone.Promiseを使用して、希望の処理を実装できました。

=================================================================================

//####################################################
//
// 地図をロード
//
//####################################################
function loadMap(){

return new Promise(function(resolve, reject) {

// document.write を定義します
var nativeWrite = document.write;
document.write = function(html) {
var m = html.match(/script.+src=“([^”]+)"/);
if (m) { load(m[1]);}
else { nativeWrite(html); }
};

load(“[https://api.its-mo.com/cgi/loader.cgi?key=\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*&ver=2.0&api=zdcmap.js,control.js,submap.js,shape.js,geo.js,userwidget.js,search.js,geojson-1.0.js](https://api.its-mo.com/cgi/loader.cgi?key= **************** &ver=2.0&api=zdcmap.js,control.js,submap.js,shape.js,geo.js,userwidget.js,search.js,geojson-1.0.js)”);

resolve(“地図のロード完了”);

}).then(function(resp_) {
if (resp_ === “地図のロード完了”) {
console.log(“地図のロード完了”);

waitLoaded_detail(event, ‘index’, 10000, 100);

//####################################################
//
// 地図がロードされるまで待機する(詳細画面)
//
//####################################################
function waitLoaded_detail(event, mode, timeout, interval) {

return new Promise(function(resolve, reject) {

setTimeout(function() {
var remainingTime = timeout - interval;
if (typeof ZDC === ‘object’) {

// 詳細画面の場合
// return setLocationDetail(event);

resolve(“詳細画面のマップロード完了”);

} else if (timeout > 0) {

waitLoaded_detail(event, mode, timeout, interval);

} else {
//abort
}
}, interval);

}).then(function(resp_) {
if (resp_ === “詳細画面のマップロード完了”) {
console.log(“詳細画面のマップロード完了”);

setLocationDetail(event)

//####################################################
//
// 緯度・経度がない場合は、住所をもとに緯度・経度を算出し、
// フィールドに値を入れた後、レコードを更新します
//
//####################################################
function setLocationDetail(event) {

return new Promise(function(resolve, reject) {

// レコード情報を取得します
var rec = event[‘record’];

// 緯度・経度が入力されていれば、緯度・経度から最寄り駅を算出します
if (rec[‘lat’][‘value’] || rec[‘lng’][‘value’]){

/* 検索地点の緯度経度 */
var point = new ZDC.LatLon(rec[‘lat’][‘value’], rec[‘lng’][‘value’]);

/* 周辺の駅検索を実行 */
ZDC.Search.getStationByLatLon({
latlon: point,
radius: 1000
},function(status, res) {

if (status.code == ‘000’) {
/* 取得成功 */
nearest_station(status, res);
console.log(“取得成功”);
} else {
/* 取得失敗 */
alert(status.text);
console.log(“取得失敗”);
}
});

function nearest_station(status, res) {

var ns_item = res.item;
var ns_res = “”;

console.log(“ヒット数:” + ns_item.length);

for (var i = 0, j = ns_item.length; i<j; i++) {

var walk = Math.ceil(ns_item[i].distance / 80);

ns_res += ns_item[i].poi.text + " (" + ns_item[i].distance + “m / 徒歩約” + walk + “分)” + “”;

}

// console.log(ns_res);
resolve(ns_res);

}
}

}).then(function(resp_) {
console.log(resp_);

return event;
});

}

} else {
console.log(“詳細画面のマップロード未完了”);
}
return event;
});

}

} else {
console.log(“地図のロード失敗”);
}
return event;
});
}

//マップロード
loadMap();

=================================================================================

すべてのfunction関数にkintone.promiseを入れて動作確認したところ希望の動作となったので良しとしました。

 

ありがとうございました。