【问题标题】:How would I perform variable capture in a higher order javascript function?我将如何在更高阶的 javascript 函数中执行变量捕获?
【发布时间】: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


【解决方案1】:

我不确定您要在代码中执行什么操作,因为缺少某些部分(或无偿的部分,我已在下面评论或删除),但 @987654321 中的 lints @。

/*jslint node, es6, for, white */

var request = require("request");

function func(cb) {
    "use strict";

    var params = {};

    // See https://plus.google.com/108103301822680819489/posts/ZWBUMhYGcrH
    request(params, function (ignore, response) {
        const devices = response.body;
        var completedCounter = 0;

        Object.keys(devices).forEach(function(/*k*/) {
            // var device = devices[k]; // `device` is unused, so we need neither it nor `k`, above
            var params2 = {};

            request(params2, function (err, response2) {
                if (!err && response2.statusCode === 200) {
                    completedCounter += 1;
                    if (completedCounter === devices.length) {
                        cb(null, "message here");
                    }
                } else {
                    cb(err, "message here");
                }
            });
        });
    });
}

func(); // Needs to be used or exported somehow.

JSLint 中的屁/箭头符号

JSLint 确实希望在一行中返回一个“屁”(arrow notation)。否则,JSLint 更喜欢您使用 function ( 表示法来使您正在做的事情更加清晰。

查看讨论here, at the JSLint discussion group。 Crockford 在上面演示了我的建议,然后 Lee Chase 补充道......

箭头函数有{}的问题,主要是多行 函数或对象。

碰巧你的函数没有返回多行箭头 函数需要返回。

这有点道理。而该链接上的 OP 正是 JSLint 试图帮助您避免的错误。也就是说,文体错误确实(在that case 中)导致了功能错误。

您的“循环中的函数”问题

forEachObject.keys 结合使用,另一组JSLint 建议(Object.keysfor)也有助于消除重新声明函数的开销。通常,您不想使用for (x in y)

虽然为什么 JSLint认为 for... of 是 ES6 的“好部分”,但我不知道。

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多