[英]Can I get a value returned from a $.Deferred() that can be used in the display?
我正在使用$.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(),並在該調用內傳遞“ Current”或“ Projected”,以便顯示正確的數據。 覺得我浪費了一個星期的時間來研究這個問題很愚蠢,但是希望這個答案可以對其他人有所幫助。 您不能從這些承諾中提取數據,但是可以調用另一個函數(在我的情況下為gauge5.update)並將其要使用的值發送給它。
您將在回調內而不是在函數NewValue中返回“數據”。 NewValue應該返回promise,NewValue的調用者應該在完成該promise時分配一個回調。
function NewValue(){
var defer = $.Deferred();
var dataPromise = GetDataFromJson();
dataPromise.done(function(data){
//note both console.log(data) and alert(data) deliver the correct result here
deferred.resolve(data);
});
return deferred.promise();
}
NewValue()
.done(function(data){
// do whatever
})
我假設您想在NewValue函數中進一步處理數據,否則為什么不能直接調用GetDataFromJson?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.