Javascript 尝试为getJSON重用函数

Javascript 尝试为getJSON重用函数,javascript,eval,getjson,Javascript,Eval,Getjson,这就是我的情况 我正在编写一些具有多个API调用(我现在已经10个了,而且还在增长)的代码,每个API调用使用一个单独的函数 这些功能看起来都类似于: var today = new Date(); specificArray.length = 0; $.getJSON("https://api-location1", function (data) { $.each(data, function (key, value) { specificArray[value.ID

这就是我的情况

我正在编写一些具有多个API调用(我现在已经10个了,而且还在增长)的代码,每个API调用使用一个单独的函数

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

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地址、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-从我读到的所有内容来看,eval是邪恶的,不应该被使用-但出于同样的原因-我认为这是它的一个很好的用途,因为它只评估在不同函数的代码中指定的特定字符串

或者有没有更好的方法来解决这个问题

先谢谢你

新编辑:下面是一个JSFIDLE,我将其用作示例-

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


附加编辑:这里有一个与此相同的LiveWeave示例(我的办公室阻止JSFIDLE运行,但不阻止LiveWeave…见图)

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

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

我认为它会更灵活。另外,如果您经常使用带有不同参数的
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);

在研究和尝试不同的东西之后,这对我来说是有效的

我将myValues.instance从

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

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

$.getJSON(someValues.apicall, function (data) {
  $.each(data, function (key, value) {
    someValues.instance(value);
  }
}
这非常有效

感谢所有提交答案的人。特别感谢GRaAL,他让我在讨论函数时走上了正确的轨道


DocKraz看起来不需要
eval()
并删除
myValues.instance
OK周围的引号-我更新了fiddle以更能代表正在发生的事情,而没有实际创建要读取的JSON文件…但是删除所述对象项周围的eval和引号不会导致任何事情发生(JS代码中的错误);和myItems.roleinfo=函数createData(){返回新角色(r[i].id,r[i].Role,r[i].unitid);};当我运行它时,我在最后一个数组中得到未定义的值
myValues.instance = function (v) { this.table[v.someID] = new Instance(v.someID, v.someData);
myValues.table = [];
$.getJSON(someValues.apicall, function (data) {
  $.each(data, function (key, value) {
    someValues.instance(value);
  }
}