2017-11-11 1 views
1

Node.jsを学び始めていて、Coinbase APIをクエリしてBitcoinの価格に関するデータを取得するExpressフレームワークを使用してアプリケーションを構築しようとしています。 。Node JS:httpを使用してAPIからコールバック関数を使用してデータを返す

私は1つのことに苦労していますが、ノード上のコールバック関数が新しくなっているので、それは役に立ちません。

私はAPIを完全に照会してデータを取得することができますが、何らかの形で価格を返すと、いつも「未定義」に戻ります。

コールバックが使用されていない単純なクエリでこの問題が発生していたので、コールバックが不足していると想定しました。しかし、私は今でも同じ問題を抱えており、私は数多くの反復を試みました。私は解決策を見つけることができないようです。どんな助けもありがとう。

var url = 'https://api.coinbase.com/v2/prices/spot?currency=USD'; 
 

 
function makeCall (url, callback) { 
 
    https.get(url,function (res) { 
 
     res.on('data', function (d) { 
 
      callback(JSON.parse(d)); 
 
     }); 
 
     res.on('error', function (e) { 
 
      console.error(e); 
 
     }); 
 
    }); 
 
} 
 

 
function handleResults(results){ 
 
    return Number((results.data.amount))*14.5; 
 
} 
 

 
console.log(makeCall(url, function(results){ 
 
\t handleResults(results);  
 
}));

答えて

1

makeCall()実際には何も返しません。だから、呼び出すとき:

console.log(makeCall(url, function(results){ 
    handleResults(results);  
})); 

コンソールへmakeCall()の即時戻り値を(undefinedである)書いています。 console.log()が届くには、handleResults()からの返事が遅すぎます。

少し慣れています。しかし、非同期コールバックの値が必要なときは、アクセスするのを待つ必要があります。例えば、これは動作します:

function handleResults(results){ 
    console.log(Number((results.data.amount))*14.5;) 
} 

は約束を使用することを学ぶことができます読みこれのいくつかは、より直感的かつ容易になります。アドバイス@Mark_Mため

const https = require('https') 
var url = 'https://api.coinbase.com/v2/prices/spot?currency=USD'; 

function makeCall (url) { 
    return new Promise((resolve, reject) => { 
     https.get(url,function (res) { 
      res.on('data', function (d) { 
       resolve(JSON.parse(d)); 
      }); 
      res.on('error', function (e) { 
       reject(e) 
      }); 
     }); 
    }) 

} 

function handleResults(results){ 
    return Number((results.data.amount))*14.5; 
} 

makeCall(url) 
.then(function(results){ 
    console.log(handleResults(results)) 
}) 
.catch(console.log) 
+0

おかげで多くのことを:あなたはそれが好きで書くことができる約束を使用して

。それが有利な選択肢であると思われるので、私たちに進むつもりです。私は、コードとして価格を返す必要があるという点で、コードに苦労しています。私は変数として保存したいので、他の計算を価格で実行することができます。たとえば、makeCall APIコールのresults.data.amountをいくつかの変数、たとえば "price"と等しいものに設定したいとしますか? –

+0

私はあなたが聞いて、それは最初は混乱しています。あなたは通常、コールバックから何かを返すことはできませんし、ある時点ですでに実行されている元の関数に到達するため、それらが動作することを期待することはできません。非同期の値を他のコールバックに渡すか、約束を使用する必要があります。 –

関連する問題