javascript:没有使用回调函数获得正确的结果

时间:2014-03-19 03:06:26

标签: javascript object callback

我查看了类似的问题,并尝试了Object.key(patientList).length但它返回0.我建议使用回调,这就是我如何实现它。

var data;
var patientList = {};
var parseDate = d3.time.format("%d/%m/%y").parse;

function input_Data()  {

    d3.json("data.php", function(error, json)  {
    if (error) return console.warn(error);
        data = json;
        console.log(data);

           for(var i = 0; i < data.length; i++)  {
            var name = data[i].name;
                //data[i].dates = parseDate(data[i].dates);
            if(!patientList[name])  {

            var newPatient = {
                dates: [data[i].dates],
                alpha: data[i].alpha,
                beta: data[i].beta
            };

            patientList[name] = newPatient;

            } else  {

            patientList[name].dates.push(data[i].dates);
            }
        }
        console.log(patientList);
            console.log(Object.keys(patientList).length);
            console.log(Object.keys(patientList));
       });

}

function number_of_patients(callback) {
    callback();
    console.log(patientList);
    console.log(Object.keys(patientList).length);
    console.log(Object.keys(patientList));
}

number_of_patients(input_Data);
input_Data函数内的console.log显示长度为4的正确结果.sumber_of_patients中的console.log显示正确的patientList,但长度为0,并且不显示名称(键)。我已经阅读了类似的帖子,但仍然无法解决这个问题。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

在Javascript中,的通用对象具有length属性。

有关Javascript对象的常见事实:

  • 对象包含键:值对,其中键是字符串,值可以是任何类型。
  • 对象没有.keys()方法来获取所有键,除了...
  • Ecmascript 5提供了一个Object.keys(),可以像一些第三方库一样明确调用,如underscore.js
  • 使用花括号{}key:value
  • 进行初始化

在此之前,计算或访问对象的特定实例所特有的所有键的常用方法是使用如下循环:

l=0;    
for(var k in obj){ 
        if (obj.hasOwnProperty(k)){
          // hasOwnProperty ignores keys from the prototype chain
          // do something with key k, value obj[k]
           ++l;
        }
    }
// the object has l keys specific to this instance

如果您需要快速获得length,则应考虑使用数组对象:

  • 数组对象(x = [1,2,3,'sam',{'name':'fred', 'status': 'dead'}])具有以0开头的数字索引,并且可以包含任意类型的成员。
  • 有一个长度属性(x.length是5)
  • 值由带有方括号的数字索引访问,即x[2]为3
  • 初始化使用方括号[],其中包含以逗号分隔的值列表

正如其他人在评论中所说,异步调用通常会立即返回 - 并且没有您想要的范围内的数据或对象。要访问数据,您必须在定义数据的上下文中执行代码,即编写访问回调函数中的异步数据/对象的代码,而不是主代码。