2016-07-27 33 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'函数分配回调。 –

相关问题