试图为getJSON重用一个函数

时间:2014-01-29 21:01:45

标签: javascript eval getjson

所以这是我的情况......

我正在编写一些有几个API调用的东西(我现在已经10岁了,而且还在增长),每个调用都使用一个单独的函数。

这些功能看起来都类似于:

var today = new Date();
specificArray.length = 0;
$.getJSON("https://api-location1", function (data) {
    $.each(data, function (key, value) {
        specificArray[value.ID] = new Instance(value.ID, value.Name, {etc...});
    });
});
localStorage.setItem('lsItem1', today.toString());
localStorage.removeItem('aTable');
localStorage.setObject('aTable', specificArray);

各种函数中唯一不同的是从JSON调用中修改的specificArray,给定调用的api-address,localStorage键引用以及传递给给定实例的项目数(我在这里用作通用名称 - 每个函数都有一个不同的“新实例”调用。(例如新员工,新项目,新产品等)。

现在,我通过创建一个传递包含所有这些不同项的对象的单个函数来测试它,并在specifiedArray调用中使用eval ...

myValues.table = 'aTable'; 
myValues.item = 'lsItem1';
myValues.apicall = 'https://api-location1'
myValues.id = 'value.ID';
myValues.instance = 'new Instance(value.ID, value.Name, {etc...})';
myAPICall(specifiedArray, myValues);

function myAPICall(theArray, someValues) {
  var today = new Date();
  theArray.length = 0;
  $.getJSON(someValues.apicall, function (data) {
    $.each(data, function (key, value) {
      specificArray[eval(someValues.id)] = eval(someValues.instance);
    });
  });
  localStorage.setItem(someValues.item, today.toString());
  localStorage.removeItem(someValues.table);
  localStorage.setObject(someValues.table, theArray);
}

这似乎工作得很好 - 但我所关心的是eval - 从我读过的所有东西都是邪恶的而且不应该被使用 - 但出于同样的原因 - 我认为这是一个很好的用途,因为它只评估在不同函数的代码中分配的特定字符串...

还是有更好的方法可以解决这个问题吗?

提前致谢...

新编辑:这是一个我正在使用的JSFiddle作为示例 - http://jsfiddle.net/e876q/

请注意:如果我不使用eval,那么点击按钮时这不会显示正确的响应!

附加编辑:这是一个相同的LiveWeave示例(我的办公室阻止JSFiddle从运行但不是LiveWeave ...去图)http://liveweave.com/wf1oAU

3 个答案:

答案 0 :(得分:1)

您不需要在此处使用eval。只需直接传递您正在处理的对象 - 无需传递字符串。

答案 1 :(得分:0)

而不是eval你可以使用函数,就像这样(我省略了你脚本的一些细节):

myValues.id = function getId(value) { return value.ID;}
myValues.instance = function createInstance(value) { return new Instance(...)}
myAPICall(specifiedArray, myValues);

function myAPICall(theArray, someValues) {
  $.getJSON(someValues.apicall, function (data) {
    $.each(data, function (key, value) {
      specificArray[someValues.id()] = someValues.instance();
    });
  });
}
我认为它会更灵活。此外,如果您经常使用具有不同参数的myAPICall,那么建立函数工厂可能是个好主意,如下所示:

function myAPICallCreator(someValues) {
    return function(theArray) {
       //...
       $.getJSON(someValues.apicall, function (data) {
          $.each(data, function (key, value) {
             specificArray[someValues.id()] = someValues.instance();
          });
       });
       //...
    }
}

var callFunction1 = myAPICallCreator({id: ..., instance: ..., apicall: ...});
var callFunction2 = myAPICallCreator({...});

//...

callFunction1(array1);
callFunction2(array2);

答案 2 :(得分:0)

经过研究和尝试不同的事情,这对我有用......

我从

更改了myValues.instance
myValues.instance = 'new Instance(value.ID, value.Name, {etc...})';

myValues.instance = function (v) { this.table[v.someID] = new Instance(v.someID, v.someData);
myValues.table = [];

然后在我的json函数中,我做了:

$.getJSON(someValues.apicall, function (data) {
  $.each(data, function (key, value) {
    someValues.instance(value);
  }
}

完美无缺。

感谢所有提交答案的人。特别感谢GRaAL让我在正确的轨道上谈论功能。

DocKraz