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

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

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

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

JavaScript

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

Q&A

解決済

1回答

3993閲覧

node.jsで同期的にrestをやりとりしたい

koyana

総合スコア7

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2017/01/31 12:49

###前提・実現したいこと
node.jsを使って、APIをPostする関数を作って、返り値を呼び出せるようにしたい。(下記の1〜3を実現したい)です。

  1. 認証用URLにidとpasswordをPostしてtokenを取得する
  2. 取得したtokenを使ってAPIにPostして結果(json)を取得する
  3. 結果を返却する
  4. 結果からtokenを取得して、次のRequestにPostする

###該当のソースコード

var request = require('superagent'); var login_url = "https://xxx/service/v2/webapi/login"; var login_id="XXX" var password="YYY" function getAuth(login_url, login_id, password) { return new Promise(function(resolve, reject) { request .post(login_url) .set('X-HEADER-A', 'a') .set('X-HEADER-B', 'b') .type('form') .send({login_id: login_id, password: password}) .end(function(err, res){ if (err) { reject(err); return; } resolve(res); }); }); } function onFulfilledAuth(res) { var resj = JSON.parse(res.text); access_token = resj['result']["access_token"]; // console.log("access_token: " + access_token); return {access_token: access_token}; } function onRejeted(err) { console.log(err); } var auth = getAuth(login_url, login_id, password).then(onFulfilledAuth, onRejeted); console.log(auth)

コメントアウトしたonFulfilledAuth(res)ないのconsole.logでは値が表示されるのですが、実行すると

Promise { <pending> }

が表示されてしまいます。
どのように修正すれば次の関数に引き渡せる形にできますか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Promise は then で実行した値の戻り値をさらに then で繋ぐことが可能です。ですので、

javascript

1var auth = getAuth(login_url, login_id, password) 2 .then(onFulfilledAuth, onRejeted) 3 .then((access_token) => { 4 console.log(access_token); 5 });

のように次のthenに渡してあげてその中で関数として実行する方が良いでしょう。
これを上述したようにthenの外側で実行してしまうと値は取れません。Node.jsはネットワーク通信は必ず非同期なので、それを同期的に呼び出す方法は現時点ではありません。

投稿2017/02/01 02:23

yosuke_furukawa

総合スコア390

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

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

koyana

2017/02/03 00:43

頂いたサンプルで取得できました。ネットワーク通信は同期的に呼び出す方法はないのですね、勉強になりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問