javascript - 我可以获得从 $.Deferred() 返回的可在显示中使用的值吗?

标签 javascript jquery d3.js

我正在使用 $.Deferred 方法尝试获取一个函数来加载一些 Json,处理结果,然后将值传递回另一个将使用结果的函数(在此如果我期望一个整数)。由于某种原因,我可以使用 alertconsole.log 函数显示此整数,但是当将其用作实际函数的返回值时,代码会下降并返回未定义

这是我的代码供引用:

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 调用中调用仪表更新函数 - 所有这些 promise 似乎都是毫无意义的干扰,只是传递正确的信息:

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(),并在该调用中传递“当前”或“预计”,以便显示正确的数据。我浪费了一周的时间来研究这个,这感觉很愚蠢,但希望这个答案对其他人有帮助。您无法从这些 promise 中提取数据,但您可以调用另一个函数(在我的例子中为 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?

关于javascript - 我可以获得从 $.Deferred() 返回的可在显示中使用的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38602488/

相关文章:

javascript - D3 : Merge JSON object entries

javascript - JS/JQUERY如何优先点击同一个DIV中的按钮

javascript - JQUERY:如何使用文本框作为工具提示来标记选定的文本

javascript - 这是否符合 Javascript 闭包的条件?

javascript - ajax 表单不起作用

javascript - 更改其类别后单击链接已更改不起作用

javascript - typescript 使用 map 进行迭代并使用索引获取键,值和删除项目

jquery - onblur 事件可以与 Jeditable 和 jQuery UI sortable 一起使用吗?

javascript - d3.js 无法将加载的 json 数据分配给变量

Javascript 颜色渐变均匀 split ,从蓝色到灰色再到红色