我正在使用$.Deferred
方法試圖獲得一個函數來加載一些Json,處理結果,然後將值傳遞迴另一個將使用結果的函數(在這種情況下,我期望一個整數)。出於某種原因,我可以使用alert
或console.log
函數來顯示此整數,但是如果將它用作實際函數的返回值,則代碼會覆蓋並返回undefined
。
僅供參考,這裏是我的代碼:
function NewValue(){
var dataPromise = GetDataFromJson();
dataPromise.done(function(data){
//note both console.log(data) and alert(data) deliver the correct result here
return data;
});
}
function GetDataFromJson() {
var jsonData;
var deferred = $.Deferred();
d3.json("http://localhost:8000/pipeline.json", function(dataFromServer){
jsonData = dataFromServer;
headers = ["Won"];
myTotal = 0;
chunks = (headers.map(function(priceRange) {
return jsonData.map(function(d) {
return {y: +d[priceRange]};
});
}));
var myTarget = 10000000;
chunks.forEach(function (arrayItem)
{
var l = 12;
for(var i = 0; i < l; i++) {
myTotal += arrayItem[i].y;
};
});
myTotal = myTotal/myTarget*100;
deferred.resolve(myTotal);
});
return deferred.promise();
}
有沒有可能從GetDataFromJson()
返回值,並使用它,否則我會永遠只能是能夠將其登錄到控制檯?
編輯通過答題讀書要做到這一點的唯一方法後打電話給我GetDataFromJson調用內規更新功能 - 所有這些承諾都看似毫無意義的雜念從剛纔路過的權利信息跨越:
function GetDataFromJson(f) {
var jsonData;
var deferred = $.Deferred();
d3.json("http://localhost:8000/pipeline.json", function(dataFromServer){
jsonData = dataFromServer;
if(f == "Current"){
console.log('c');
headers = ["Won"]
} else if(f == "Projected"){
console.log('p');
headers = ["Won", "Prospecting", "Qualifying", "Demonstrating", "Negotiating"]
}
else {
alert('An error has occured')
};
myTotal = 0;
chunks = (headers.map(function(priceRange) {
return jsonData.map(function(d) {
return {y: +d[priceRange]};
});
}));
var myTarget = 10000000;
chunks.forEach(function (arrayItem)
{
var l = 12;
for(var i = 0; i < l; i++) {
myTotal += arrayItem[i].y;
};
});
myTotal = myTotal/myTarget*100;
gauge5.update(myTotal);
deferred.resolve(myTotal);
});
return true;
}
現在我直接通過單擊單選按鈕來調用GetDataFromJson(),並在該調用中傳遞「當前」或「預計」,以顯示正確的數據。感到愚蠢的是,我一個星期都在研究這個問題,但希望這個答案能夠幫助其他人。您無法從這些承諾中提取數據,但可以調用另一個函數(在我的情況下爲gauge5.update)並將其發送給您想要使用的值。
你不應該在你的問題中回答。回答你自己的問題是完全有效的 – Liam
我想我會在下面標記答案是正確的,因爲它幫助我理解發生了什麼 - 然後只更新問題以顯示實際的代碼。 – Zoinks10
這很好,但如果你有另一個答案,你應該添加一個答案。就目前而言,你已經在問題中提出了你的答案。這是不正確的。問題應該只包含問題 – Liam