【问题标题】:Blocking the event loop with for..in用 for..in 阻塞事件循环
【发布时间】:2013-08-16 18:32:12
【问题描述】:

我想使用重新验证器 (https://github.com/flatiron/revalidator) 的架构定义检查 Javascript 对象是否存在不需要的属性。

我想出了以下sn-p:

function strip(object, schema) {
    var strippedObject = {};
    for (var property in schema.properties) {
        if (schema.properties[property].type === 'object') {
            strippedObject[property] = strip(object[property], schema.properties[property]);
        } else {
            strippedObject[property] = object[property];
        }
    }
    return strippedObject;
}

此代码复制所需的属性并在模式上同步循环,并递归到嵌套模式中。

我担心这次会阻塞事件循环。

这可以忽略不计,因为我不做 I/O 吗?

编辑

感谢 cmets。就像 jbaylina 提到的那样,模式确实嵌套到最多 2 个级别,每个级别可能有大约 10 个属性。尽管如此,我还是尝试使用 setImmediate 并且它可以工作,但是当它确实是一个问题时,我可能会异步迭代:

function strip(object, schema, callback) {
    var strippedObject = {};
    async.each(Object.keys(schema.properties), function (property, next) {
        if (schema.properties.hasOwnProperty(property)) {
            if (schema.properties[property].type && schema.properties[property].type === 'object') {
                strip(object[property], schema.properties[property], function (err, obj) {
                    if (err) return next(err);
                    strippedObject[property] = obj;
                    next();
                });
            } else {
                strippedObject[property] = object[property];
                next();
            }
        }
    }, function (err) {
        if (err) return callback(err);
        return callback(null, strippedObject);
    });
}

这看起来真的很乱,但它可以工作并且通过了测试。您如何看待这个解决方案?

【问题讨论】:

    标签: javascript node.js for-in-loop


    【解决方案1】:

    对于大型复杂对象图来说不可忽略,因为它是递归的。由于它是递归的,您可以轻松地在 setTimeout 或 setImmediate 中调用下一个递归以释放事件循环。

    Re:从性能的角度来看,编辑这个看起来不错。看起来它可以重构为更具可读性,但我认为您对问题领域和您精心设计的解决方案有一个扎实的把握。

    【讨论】:

    • +1 表示 setImmediate。它本质上接受递归调用并将其放在循环堆栈的末尾,因此它保持它在循环中的位置,但让其他任何它会阻塞的东西首先通过。
    【解决方案2】:

    除非架构有数千个属性,否则应该不是问题。尝试测量 subrutine 在“标准环境”中最坏情况下所花费的时间如果该时间不可接受,您可以将此循环拆分为多个部分。见Prevent long running javascript from locking up browser

    【讨论】:

    • 这是关于节点,而不是浏览器,但你可能是对的,因为架构很小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多