Javascript D3-等待$.ajax请求完成

Javascript D3-等待$.ajax请求完成,javascript,d3.js,Javascript,D3.js,我正在处理一个d3项目,该项目使用d3.json()拉入一个json文件,然后将响应传递给另一个名为update()的函数,该函数在数组中循环,并对每个项运行ajax调用并返回结果。然后,我尝试过滤掉为htrans属性定义了false的所有项,该属性被添加到success和failed回调函数中。我遇到的问题是,当我执行过滤器时,worldMap变量似乎没有htrans属性,但是如果我将console.log元素记录下来,我可以看到它。我已经创建了一个用于演示该功能的示例,并包含了下面的代码 我

我正在处理一个d3项目,该项目使用d3.json()拉入一个json文件,然后将响应传递给另一个名为update()的函数,该函数在数组中循环,并对每个项运行ajax调用并返回结果。然后,我尝试过滤掉为htrans属性定义了false的所有项,该属性被添加到success和failed回调函数中。我遇到的问题是,当我执行过滤器时,worldMap变量似乎没有htrans属性,但是如果我将console.log元素记录下来,我可以看到它。我已经创建了一个用于演示该功能的示例,并包含了下面的代码

我知道这与回报承诺有关,并且相信当我运行过滤器时,worldMap可能不会完全完成。有没有办法解决这个问题

var url = "https://gist.githubusercontent.com/jkeohan/d77d5ab47e018defe48d54f59acefb65/raw/ff61673eff2e7bf610c5a426c5bd9ca46da2a9da/worldmap_geojson.json";

d3.json(url,function(err, world)  {
  var worldMap = update(world);
  worldMap.features.filter(function(d){
   if (d) { console.log(d.htrans); return d }; // this doesn't have the   htrans property
  });
  console.log(worldMap); // this displays the the htrans property
});

function update(obj){
  obj.features.filter(function(d,i) {
   var code = d.properties.iso_a2.toLowerCase();
   var url = "https://www.googleapis.com/language/translate/v2?key=AIzaSyAADudga5Cdk2QlHDWF8UAHQEy-Z_ikHw8&target=" + code + "&q=Hello";  
   return $.when(ajaxCall(url)).then(doneCB, failCB);

   function doneCB(data){
    d.hello = data.data.translations[0].translatedText;
    d.htrans = true;
    //console.log(d)
    return d;
   }

   function failCB(data){
    d.hello = "";
    d.htrans = false;
    //console.log(d)
    return d;
  };

  function ajaxCall(url) {
   return $.ajax(url);
  };

 });//filter
 return obj;
};

为你的世界地图创造一个新的承诺

d3.json(url,function(err, world)  {
  var worldMap = new Promise( function(resolve, reject){
         update(world, resolve,reject);
  })

  worldMap.then(//do something if worldMap promise resolves something good
      function(val){          
        val.features.filter(function(d){
            if (d) { 
              console.log(d.htrans);
            };
        });
      }
  )
  .catch(// if error happened inside promise
    function(reason) {
        console.log('reason');
  });

});
并像这样解决这个承诺:

function update(obj, resolve, reject){
  obj.features.filter(function(d,i) {
   var code = d.properties.iso_a2.toLowerCase();
   var url = "https://www.googleapis.com/language/translate/v2?key=AIzaSyAADudga5Cdk2QlHDWF8UAHQEy-Z_ikHw8&target=" + code + "&q=Hello";  
   return $.when(ajaxCall(url)).then(doneCB, failCB);

   function doneCB(data){
    d.hello = data.data.translations[0].translatedText;
    d.htrans = true;
    //console.log(d)
    resolve(d); //resolve on success
   }

   function failCB(data){
    d.hello = "";
    d.htrans = false;
    //console.log(d)
    reject(d); //reject on error
  };

  function ajaxCall(url) {
   return $.ajax(url);
  };

 });//filter
 return obj;
};

看看:

为您的世界地图创建一个新的承诺

d3.json(url,function(err, world)  {
  var worldMap = new Promise( function(resolve, reject){
         update(world, resolve,reject);
  })

  worldMap.then(//do something if worldMap promise resolves something good
      function(val){          
        val.features.filter(function(d){
            if (d) { 
              console.log(d.htrans);
            };
        });
      }
  )
  .catch(// if error happened inside promise
    function(reason) {
        console.log('reason');
  });

});
并像这样解决这个承诺:

function update(obj, resolve, reject){
  obj.features.filter(function(d,i) {
   var code = d.properties.iso_a2.toLowerCase();
   var url = "https://www.googleapis.com/language/translate/v2?key=AIzaSyAADudga5Cdk2QlHDWF8UAHQEy-Z_ikHw8&target=" + code + "&q=Hello";  
   return $.when(ajaxCall(url)).then(doneCB, failCB);

   function doneCB(data){
    d.hello = data.data.translations[0].translatedText;
    d.htrans = true;
    //console.log(d)
    resolve(d); //resolve on success
   }

   function failCB(data){
    d.hello = "";
    d.htrans = false;
    //console.log(d)
    reject(d); //reject on error
  };

  function ajaxCall(url) {
   return $.ajax(url);
  };

 });//filter
 return obj;
};

看一看:

@JoeKeohan很高兴你找到了答案:)@JoeKeohan很高兴你找到了答案:)