我可以从$ .Deferred()返回一个可以在显示中使用的值吗?

时间:2016-07-27 01:56:58

标签: javascript jquery d3.js

我正在使用$.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调用中调用仪表更新功能 - 所有这些承诺似乎都是毫无意义的干扰,只是传递正确的信息:< / p>

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)并将其发送给您想要使用的值。

1 个答案:

答案 0 :(得分:2)

您正在返回数据&#39;内部回调,而不是函数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?