如何在node.js中使此功能异步

太阳恋人

情况如下:我是node.js的新手,我有一个40MB的文件,其中包含多层json文件,例如:[{},{},{}]这是一个对象数组(约7000个对象)。每个对象都有属性,其中一个属性也是对象的数组

我编写了一个函数来读取文件的内容并对其进行迭代。我成功地获得了我想要的内容,但没有可用性。我以为我写了一个异步函数,该函数将允许节点在迭代数组时服务于其他Web请求,但事实并非如此。如果有人能指出我做错了什么以及如何重写它,以便可以进行非阻塞迭代,我将非常感激。这是处理情况的函数:

    function getContents(callback) {

        fs.readFile(file, 'utf8', function (err, data) {

            if (err) {
                console.log('Error: ' + err);
                return;
            }

            js = JSON.parse(data);
            callback();
            return;
        });
    }

    getContents(iterateGlobalArr);

    var count = 0;
    function iterateGlobalArr() {

        if (count < js.length) {

            innerArr = js.nestedProp;

            //iterate nutrients
            innerArr.forEach(function(e, index) {

                //some simple if condition here

            });

            var schema = {
                //.....get props from forEach iteration
            }

            Model.create(schema, function(err, post) {

                if(err) {
                    console.log('\ncreation error\n', err);
                    return;
                }

                if (!post) {
                    console.log('\nfailed to create post for schema:\n' + schema);
                    return;
                }
            });

            count++;
            process.nextTick(iterateGlobalArr);
        }
        else {
            console.log("\nIteration finished");
            next();
        }

这样就很清楚我是如何测试上述情况的。我打开两个选项卡,其中一个加载此迭代会花费一些时间,第二个选项卡是另一个节点路由,直到迭代结束才加载。因此,基本上我已经写了一个阻塞代码,但不确定如何重构它!我怀疑只是因为回调中发生了所有事情,所以我无法释放事件循环来处理另一个请求...

杰伊·库里(Jay Kuri)

您的代码几乎正确的。您正在做的是无意中将所有项目添加到下一个刻度...仍然阻塞。

重要的代码片段在这里:

          Model.create(schema, function(err, post) {

            if(err) {
                console.log('\ncreation error\n', err);
                return;
            }

            if (!post) {
                console.log('\nfailed to create post for schema:\n' + schema);
                return;
            }
        });

        // add EVERYTHING to the very same next tick!
        count++;
        process.nextTick(iterateGlobalArr);

假设当getContents()运行且count为0时,您处于事件循环的滴答A中。您输入iterateGlobalArr并调用Model.create。因为Model.create是异步的,所以它立即返回,导致process.nextTick()将项目1的处理添加到下一个刻度,比如说B。然后调用iterateGlobalArr,它执行相同的操作,将项目2添加到下一个刻度。打勾,仍然是B。然后是第3项,依此类推。

您需要做的是将计数增量和process.nextTick()移到Model.create()的回调中。这将确保在调用nextTick之前处理当前项目...这意味着在创建模型项目之后,实际上会将下一个项目添加到下一个刻度中...这将使您的应用程序有时间来处理介于两者之间的其他事情。这里是iterateGlobalArr的固定版本:

 function iterateGlobalArr() {

    if (count < js.length) {

        innerArr = js.nestedProp;

        //iterate nutrients
        innerArr.forEach(function(e, index) {

            //some simple if condition here

        });

        var schema = {
            //.....get props from forEach iteration
        }

        Model.create(schema, function(err, post) {

            // schedule our next item to be processed immediately.
            count++;
            process.nextTick(iterateGlobalArr);

            // then move on to handling this result.
            if(err) {
                console.log('\ncreation error\n', err);
                return;
            }

            if (!post) {
                console.log('\nfailed to create post for schema:\n' + schema);
                return;
            }
        });
    }
    else {
        console.log("\nIteration finished");
        next();
    }
}

还要注意,我强烈建议您传递js并在每次调用iterageGlobalArr时进行计数器处理,因为这将使您的iterateGlobalArr易于调试,除其他外,但这是另外一回事了。

干杯!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在node-pdfkit中使用异步功能?

来自分类Dev

如何在node-pdfkit中使用异步功能?

来自分类Dev

如何在Node.js中使用异步映射系列?

来自分类Dev

如何在异步 Node.JS 中使用 MySQL

来自分类Dev

如何在nodeJS中使同步功能异步

来自分类Dev

如何在javascript或node中使其异步?

来自分类Dev

如何在javascript或node中使其异步?

来自分类Dev

我如何在Discord JS中使用异步功能制作问题游戏?

来自分类Dev

如何在Ramda.js / lodash中使此代码更具“功能性编程”风格

来自分类Dev

如何向此异步功能添加超时

来自分类Dev

如何在Node.js中通过异步调用重用测试功能?

来自分类Dev

如何在Node.js中执行一系列同步和异步功能

来自分类常见问题

Node.js 7如何在异步/等待中使用序列化事务?

来自分类Dev

如何在Node.js中使用crypto.randomBytes使用异步/等待?

来自分类Dev

如何在Node.js中使用异步瀑布进行API调用

来自分类Dev

如何在某些文件中使用此node.js模块

来自分类Dev

在Node.js中使用异步等待功能与猫鼬查询

来自分类Dev

如何在Javascript中使用异步等待功能对象?

来自分类Dev

如何在Rust中使用Windows IOCP实现异步功能?

来自分类Dev

如何在JavaScript中使用此“缺少字母”功能?

来自分类Dev

如何在Excel中使用VBA执行此功能?

来自分类Dev

如何在JavaScript中使用此“缺少字母”功能?

来自分类Dev

如何在Node.js中使用repl获取模块功能的详细信息?

来自分类Dev

如何在Node.JS中编写异步While循环

来自分类Dev

如何在for循环内编写node.js异步?

来自分类Dev

如何在Node JS中将异步转换为同步

来自分类Dev

如何在Node.js中处理异步函数

来自分类Dev

如何在Node.js中处理异步函数

来自分类Dev

如何在node.js中创建异步方法链?

Related 相关文章

  1. 1

    如何在node-pdfkit中使用异步功能?

  2. 2

    如何在node-pdfkit中使用异步功能?

  3. 3

    如何在Node.js中使用异步映射系列?

  4. 4

    如何在异步 Node.JS 中使用 MySQL

  5. 5

    如何在nodeJS中使同步功能异步

  6. 6

    如何在javascript或node中使其异步?

  7. 7

    如何在javascript或node中使其异步?

  8. 8

    我如何在Discord JS中使用异步功能制作问题游戏?

  9. 9

    如何在Ramda.js / lodash中使此代码更具“功能性编程”风格

  10. 10

    如何向此异步功能添加超时

  11. 11

    如何在Node.js中通过异步调用重用测试功能?

  12. 12

    如何在Node.js中执行一系列同步和异步功能

  13. 13

    Node.js 7如何在异步/等待中使用序列化事务?

  14. 14

    如何在Node.js中使用crypto.randomBytes使用异步/等待?

  15. 15

    如何在Node.js中使用异步瀑布进行API调用

  16. 16

    如何在某些文件中使用此node.js模块

  17. 17

    在Node.js中使用异步等待功能与猫鼬查询

  18. 18

    如何在Javascript中使用异步等待功能对象?

  19. 19

    如何在Rust中使用Windows IOCP实现异步功能?

  20. 20

    如何在JavaScript中使用此“缺少字母”功能?

  21. 21

    如何在Excel中使用VBA执行此功能?

  22. 22

    如何在JavaScript中使用此“缺少字母”功能?

  23. 23

    如何在Node.js中使用repl获取模块功能的详细信息?

  24. 24

    如何在Node.JS中编写异步While循环

  25. 25

    如何在for循环内编写node.js异步?

  26. 26

    如何在Node JS中将异步转换为同步

  27. 27

    如何在Node.js中处理异步函数

  28. 28

    如何在Node.js中处理异步函数

  29. 29

    如何在node.js中创建异步方法链?

热门标签

归档