2

@asgothのおかげで、AngularJS $ httpサービスを使用して、ここで説明するようにYahooから株価を取得できます。AngularJSからの 応答を読み取ることができません$ resource JSONP get from Yahoo Finance

「getHistoricalPrice」関数では、オブジェクト内にある配列内に価格を配置します。その関数の中から、価格にアクセスしてコンソールに書き込むことができます。

この関数は、オブジェクトを元の場所に戻します。そこから、オブジェクト全体をコンソールに正常に書き出すことができます。ただし、このオブジェクトの要素にアクセスできません。さまざまな方法を試しましたが、それでもオブジェクトのデータにアクセスできません。コードはhttp://jsfiddle.net/curt00/LTazR/2/以下で確認できます。

angular.module('app', ['ngResource']);

function AppCtrl($scope, $http, $resource) {

var historical_price = getHistoricalPrice("AAPL", 'start date is hard coded', 'end date is hard coded');
console.log("after calling historical price: ", historical_price);  // historical_price is an object and all of the correct data is outputted to console here, but I cannot access its elements directly from Javascript.

for(var key in historical_price) {
    console.log("key =",key);  // this outputs "key = list"
}

console.log("after calling getHistoricalPrice: ", historical_price.list[0][1]);  // Cannot access this as browser console gives error: TypeError: Cannot read property '1' of undefined
console.log("after calling getHistoricalPrice: ", historical_price['list'][0][1]);  // Cannot access this as browser console gives error: TypeError: Cannot read property '1' of undefined
console.log("after calling getHistoricalPrice: ", historical_price[0][1]);  // Cannot access this as browser console gives error: TypeError: Cannot read property '1' of undefined


function getHistoricalPrice(symbol, start, end) {

    var query = 'select * from csv where url=\'http://ichart.yahoo.com/table.csv?s=' + symbol + '&a=' + '11' + '&b=' + '19' + '&c=' + '2012' + '&d=' + '11' + '&e=' + '19' + '&f=' + '2012' + '&g=d&ignore=.csv\'';


    var url = 'http://query.yahooapis.com/v1/public/yql?q=' + fixedEncodeURIComponent(query) + '&format=json&callback=JSON_CALLBACK';

    var histData = {};

    $http.jsonp(url, {timeout: 30000}).success(function(json) {
        var list = [];


        var result = json.query.results.row;

        result.shift(); // remove the header (columns) row
        angular.forEach(result, function(row) {
            list.push([(new Date(row.col0)).getTime()/1000, parseFloat(row.col4)]);

        });
        list.sort(function(val1, val2) {
            return val1[0] - val2[0];
        });
        histData.list = list;
        console.log('Loaded historical data',histData.list[0][1],', for ' + symbol);  // This works and gives the price
    });

    return histData;
}

var fixedEncodeURIComponent = function(str) {
    return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
};



}

<br>この問題を解決するためのヘルプや提案は大歓迎です!

4

4 に答える 4

1

それはタイミングの問題です。

12〜14行目では、データが入力される前にhistData.listにアクセスしようとしています。これは、このコードが$http.jsonp関数への成功コールバックが実行される前に実行されるためです。

完了するコールバックに依存するコードは、コールバックまたはコールバックで呼び出される関数に含まれている必要があります。

于 2012-12-20T19:52:49.343 に答える
1

https://stackoverflow.com/a/13967709/1916258で私の答えを参照してください

Yahoo APIをデバッグするための優れた方法は、YQLコンソールを使用することです:http://developer.yahoo.com/yql/console/

さまざまな可能性に関する情報(在庫情報)は、http://www.gummy-stuff.org/Yahoo-data.htmにあります。

編集:関数fixedEncodeURIComponentにまだ問題がありました。引用符( ")もエンコードする必要があります。

var fixedEncodeURIComponent = function(str) {
    return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A").replace(/\"/g, "%22");
};
于 2012-12-20T19:57:17.163 に答える
1

BobSは正しいです、あなたは物事を正しくタイミングを合わせていません。また、fixedEncodeURIComponentを呼び出した後に宣言しました。これにより、jsfiddleをロードするとすぐにエラーが発生していました。

コールバックを関数に正しく渡している間、実際には呼び出していませんでした。クエリに関連する他のエラーがあるため、jsonの後処理をすべて削除し、コールバックを実装しただけで、動作を確認できます。

リクエストが終了し、まだ成功機能を使用している場合は、追加する必要があります

if(typeof(callback) === "function"){
    callback();
}

これにより、渡した関数が呼び出されて実行されます。これが動作するjsFiddleです:http: //jsfiddle.net/LTazR/22/

また、呼び出し出力を作成した新しい変数を更新して、変化を確認できるようにしました。

于 2012-12-21T01:44:43.040 に答える
0

提案を提供してくれた皆さんに感謝します。

$ scope.symbol[user].priceなどのAngularJSの$scope変数を使用して問題を解決しました。getHistoricalPrice関数を呼び出す前にこの変数を作成し、その関数で$ http.jsonpから結果が返された後、値を$scope変数に次のように配置します。

$scope.symbol[user].price = row.col4;
于 2012-12-28T16:46:33.333 に答える