質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2109閲覧

APIを関数で呼び出したいが「undefined」が表示される

zentsu

総合スコア14

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2018/01/15 18:36

編集2018/01/15 18:40

Node.jsにてWebAPIのレスポンスデータを読み出す際の処理を関数としてまとめたいのですが、関数として実行すると戻り値がundefinedとなります。
関数として記述しなければ、処理を実行できますが、
同様の処理を繰り返し実行させたいため、関数として記述したいです。

よろしくお願いします。

javascript

1const request = require('request'); 2 3//定期実行(2秒ごと) 4setInterval(function() { 5 //ticker情報を取得 6 var cb_ticker = get_ticker('https://api.crypto-bridge.org/api/v1/ticker'); 7 8 console.log('レスポンス:' + cb_ticker); 9}, 2000); 10 11//ticker情報を取得 12function get_ticker(ticker){ 13 var URL = ticker; 14 var res = 'res-test'; 15 request.get({ 16 uri: URL, 17 headers: {'Content-type': 'application/json'}, 18 json: true 19 }, function(err, req, data){ 20 res = data[1].id; 21 return res; 22 }); 23}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

requestモジュールの処理は非同期のため、戻り値はcallback関数で受け取る必要があります。
つsync-request

投稿2018/01/15 21:01

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zentsu

2018/01/27 20:38

callback関数を使う必要があるとわかり、参考になりました。ありがとうございます!
guest

0

ベストアンサー

戻り値がundefinedとなります

get_tickerは何もreturnしていないので当然undefinedになります。そしてrequestは非同期に取得するのでその結果をget_tickerが戻り値として返すことは不可能です。

get_tickerがcallbackを受け取るようにするか、

js

1const request = require('request') 2 3setInterval(function () { 4 get_ticker('https://api.crypto-bridge.org/api/v1/ticker', (err, result) => { 5 if (result) console.log(result) 6 }) 7}, 5000) 8 9//ticker情報を取得 10const get_ticker = (ticker, cb) => { 11 cb = cb || (() => {}) 12 request.get({ 13 uri: ticker, 14 json: true, 15 }, function (err, req, data) { 16 if (err) { 17 cb(err) 18 return 19 } 20 cb(null, data[1].id) 21 }) 22}

Promiseを返すようにすればできます。

js

1const request = require('request') 2 3setInterval(function () { 4 get_ticker('https://api.crypto-bridge.org/api/v1/ticker').then(result => { 5 console.log(result) 6 }) 7}, 5000) 8 9const get_ticker = (ticker) => new Promise((resolve, reject) => { 10 request.get({ 11 uri: ticker, 12 json: true, 13 }, function (err, req, data) { 14 if (err) { 15 reject(err) 16 return 17 } 18 resolve(data[1].id) 19 }) 20}) 21

もっとも、requestPromiseバージョンであるrequest-promiseなどを使えばもっとすっきり書けます。

js

1const rp = require('request-promise') 2 3setInterval(function () { 4 get_ticker('https://api.crypto-bridge.org/api/v1/ticker').then(result => { 5 console.log(result) 6 }) 7}, 5000) 8 9const get_ticker = (ticker) => rp.get({ 10 uri: ticker, 11 json: true, 12}).then(data => data[1].id)

async/awaitでもできます。

js

1const rp = require('request-promise') 2 3setInterval(async function () { 4 const result = await get_ticker('https://api.crypto-bridge.org/api/v1/ticker') 5 console.log(result) 6}, 5000) 7 8const get_ticker = (ticker) => rp.get({ 9 uri: ticker, 10 json: true, 11}).then(data => data[1].id)

投稿2018/01/16 06:26

karamarimo

総合スコア2551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zentsu

2018/01/27 20:40

複数の手法で実現する方法をご教授いただきありがとうござます。 試して見たところ、自分の環境でもやりたいことを実現できました。 何を知るべきかが明確になり、大変勉強になりました。 すぐに実現できるソースコードまで書いていただき、ありがとうござました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問