2012-12-20 100 views
2

由於@asgoth返回的對象元素,我可以使用AngularJS $ HTTP服務檢索股票價格從雅虎:Cannot read response from AngularJS $resource JSONP get from Yahoo Finance無法訪問由JavaScript函數在AngularJS

在「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"); 
}; 



} 


任何幫助或建議,以解決這一問題是非常感謝!

+0

在定義之前使用getHistoricalPrice()。 –

+0

@DarinKolev感謝您的建議。從我調用函數的位置,我可以成功將整個對象寫入控制檯,並且可以在控制檯中查看對象陣列中的所有正確數據和數據。但是,我無法直接通過Javascript訪問元素。 – Curt

回答

0

感謝大家提供的建議。

我使用AngularJS的$ scope變量解決了這個問題,比如$ scope.symbol [user] .price。我在調用getHistoricalPrice函數之前創建了該變量,然後在該函數中從$ http返回結果之後創建了該變量。jsonp,我把這個值放到$ scope變量中,如下所示:

$scope.symbol[user].price = row.col4; 
1

這是時間問題。

在第12-14行中,您試圖在填充之前訪問histData.list。這是因爲此代碼在執行$ http.jsonp函數的成功回調之前運行。

依賴於該回調正在完成的任何代碼必須位於回調中或回調中調用的函數中。

+0

感謝BobS的建議。從我稱之爲函數的地方,我可以成功地將整個對象寫入控制檯,並且可以在控制檯中看到對象的所有數組和數據。這是不是意味着它被填充?但是,我無法訪問此對象的元素。不過,我會嘗試你的建議。 – Curt

+0

我試着把一個回調函數放到我的本地文件中。回調沒有得到執行。您可以瞭解我在更新的jsFiddle中所做的工作:http://jsfiddle.net/curt00/LTazR/7/我歡迎任何其他建議。 – Curt

+0

我得到了回調工作,但我有和以前完全相同的情況。當我將對象寫入控制檯時,所有內容(數組)都是正確的,但我無法從調用函數的位置使用JavaScript訪問數組。 – Curt

1

見我上https://stackoverflow.com/a/13967709/1916258

回答一個偉大的方式來調試雅虎API使用YQL控制檯:http://developer.yahoo.com/yql/console/

信息有關不同posibilities(其中股票信息)可以在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"); 
}; 
1

鮑勃是對的,你是不是正確的事情定時你又宣佈fixedEncodeURIComponent您曾呼籲後,這是導致即時錯誤,當我裝起來。 jsfiddle。

當你正確地將回調函數傳遞給你的函數時,你並沒有真正調用它,因爲你有一些涉及查詢的其他錯誤,並且只是實現了回調函數,所以我刪除了json的所有後處理所以你可以看到它的工作

請求完成後,你仍然在成功您需要添加的功能

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

這會調用您傳入並運行它的函數。這裏是一個工作jsFiddle它: http://jsfiddle.net/LTazR/22/

我也更新了一個新變量我創建調用輸出,所以你可以看到它的變化。