我需要一个承诺管道链,对于这个例子看起来像这样:
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之前这些东西的文档和功能改变了。
答案 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
方法几乎相同。 (只有范围会改变,谢谢......)