我可以在不使用eval()的情况下构建我的jQuery promise管道链吗?

时间:2013-11-20 11:09:14

标签: javascript jquery eval promise

我需要一个承诺管道链,对于这个例子看起来像这样:

populateOfferSettings().pipe(populateSegmentationSettings).pipe(populateHousehold).pipe(viewReady);

这是动态生成的,可以包含许多以数组形式提供的函数。我已经想出了一种方法,但它依赖于eval()。用户输入不是这里的因素,因为此功能仅供开发人员用来管理呈现视图,所以我不会觉得使用它太糟糕(我理解陷阱),但我感觉好多了这样做。

这是我的代码:

//Array of functions (generally provided as a function parameter)
var requiredFunctions = [
    'populateOfferSettings',
    'populateSegmentationSettings',
    'populateHousehold'
];

//Start building code string to evaluate later, starting with first required function
var code = requiredFunctions[0] + '()';

//Process each required function after first
$.each(requiredFunctions.slice(1), function (index, functionName) {
    //Add function to code string using pipe()
    code += '.pipe(' + functionName + ')';
});

//Add viewReady() to code string as this should always be at the end
code += '.pipe(viewReady);';

//Evaluate code string
eval(code);

是否有另一种处理函数管道的方法可以消除eval()的需要而不会使这些更冗长?似乎应该有,但我发现很难理解jQuery的承诺功能,特别是因为我目前仅限于jQuery 1.7.1之前这些东西的文档和功能改变了。

1 个答案:

答案 0 :(得分:2)

以下与@AnthonyGrist的对话:

var code = requiredFunctions[0]();

for (var i=1; i<requiredFunctions.length; i++)
   code = code.pipe(window[requiredFunctions[i]]);

如果requiredFunctions是字符串,并在window范围内定义。


code = code.pipe(requiredFunctions[i]);如果它们是函数。

还考虑使用code = code.pipe(new Function(requiredFunctions[i])),但这与window方法几乎相同。 (只有范围会改变,谢谢......)