【发布时间】:2016-10-24 21:52:36
【问题描述】:
大家好,
jslint 生我的气。 我正在循环中创建一个函数,但我也不太确定如何修复它,因为我似乎需要对结果进行curry,以使函数与回调请求所期望的签名相匹配并执行正确捕获变量或执行一些其他 javascript 操作来简化它。
编辑:代码运行良好。我只是想知道怎么做,这样棉绒就不再是在我身上了!
这段代码如下所示:
function func(cb) {
request({ params }, (error, response) => {
const devices = response.body;
let completedCounter = 0;
for (const device of devices) {
request({ params }, (err, response) => {
if (!err && response.statusCode === 200) {
completedCounter += 1;
if (completedCounter === devices.length) {
cb(null, "message here");
}
} else {
cb(err, "message here");
}
});
}
});
}
对不起,如果我的术语不是典型的 javascript 术语-我是一个在他的舒适区之外的困惑的 c++/python/lisp 程序员!
linter 输出是:
39:10 error Don't make functions within a loop no-loop-func
【问题讨论】:
-
用一个有效的对象替换
{ params }并将const device of devices更改为let device of devices允许函数编译而不会出错。这样做并使用有效的参数对象后,代码是否有效? -
哦,代码运行良好。只是 linter 不喜欢我在循环中发出请求的事实,因为从技术上讲,当发出请求时,我正在其中构建一个函数!我会在问题中说得更清楚:-)
-
看起来你的 linter 不兼容 ES6。也许改用 eslint?
-
@Traktor53 属性简写和
const声明都是有效代码,无需更改即可正确编译。 -
@calben 不是真的,这是你想在这里做的。为了满足您的 linter,您必须在循环体中调用一个函数(该函数发出一个请求并在每次迭代时创建一个回调)。但这已经过时了,而且您已经通过使用
const而不是var来缓解循环内部闭包最令人担忧的问题。
标签: javascript callback closures jslint higher-order-functions