2016-07-27 34 views
0

我正在使用$.Deferred方法試圖獲得一個函數來加載一些Json,處理結果,然後將值傳遞迴另一個將使用結果的函數(在這種情況下,我期望一個整數)。出於某種原因,我可以使用alertconsole.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)並將其發送給您想要使用的值。

+0

你不應該在你的問題中回答。回答你自己的問題是完全有效的 – Liam

+0

我想我會在下面標記答案是正確的,因爲它幫助我理解發生了什麼 - 然後只更新問題以顯示實際的代碼。 – Zoinks10

+0

這很好,但如果你有另一個答案,你應該添加一個答案。就目前而言,你已經在問題中提出了你的答案。這是不正確的。問題應該只包含問題 – Liam

回答

2

您在回調中返回'數據',而不是函數NewValue。 NewValue應該返回promise,NewValue的調用者應該在完成這個承諾時分配一個回調。

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?

+0

我很樂意從GetDataFromJson中調用它 - 我被這個問題困住了,然後沿着這條增加promise的路徑走下去。基本上NewValue()應該返回一個整數,它傳遞給一個d3函數來更新圖形。假設我可以得到返回值來產生一個整數值而不是「未定義」,我很高興無論哪種方式, – Zoinks10

+0

在NewValue()中使用你的代碼我仍然得到「NaN」返回到圖 - 它似乎是某種Javascript發回的對象:Object {state = function(),always = function(),then = function(),更多...} – Zoinks10

+0

請將您的調用更新到NewValue。你提到的對象看起來像promise對象,你需要爲'then'或'done'函數分配回調。 –

相關問題