如何在更高阶的javascript函数中执行变量捕获?

时间:2016-10-24 21:52:37

标签: javascript callback closures jslint higher-order-functions

hullo all,

jslint对我很生气。 我正在循环中创建一个函数,但我也不太确定如何修复它,因为我似乎需要调整结果,使得函数匹配请求回调所需的签名以及执行变量捕获正确或执行一些其他javascript devilry来简化它。

编辑:代码正常工作。我只是想知道怎么做才能让短信不再在我身上制作了!

代码部分如下所示:

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

1 个答案:

答案 0 :(得分:1)

我不确定你在代码中尝试做什么,因为有部分缺失(或者是无偿的部分,我在下面评论或删除了部分),但这在{{{ 3}}

/*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确实希望“放屁”(the most recent version of JSLint)在一行中返回。否则,JSLint更喜欢使用function (表示法来使您所做的更清晰。

检查讨论arrow notation。 Crockford在上面展示了我的建议,然后Lee Chase补充说......

  

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

     

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

这有点道理。并且该链接上的OP恰恰是JSLint试图帮助您避免的错误。也就是说,风格错误实际上(在here, at the JSLint discussion group中)导致了功能错误。

您的“循环功能”问题

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

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