簡體   English   中英

我可以從可以在顯示中使用的$ .Deferred()返回值嗎?

[英]Can I get a value returned from a $.Deferred() that can be used in the display?

我正在使用$.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(),並在該調用內傳遞“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM