node.js - 如何基于索引创建带有参数的函数数组

标签 node.js asynchronous

我有一组通过 async.series() 函数运行的函数,这些函数将我碰巧存储在数组中的值作为参数。

params = [ {id: 1, name: "Two tires fly. Two wail."},
           {id: 2, name: "Snow-Balls have flown their Arcs"},
           {id: 3, name: "A beginning is the time for taking the most delicate care"}
         ];
async.series(
[   function(callback) {
        myFunction(callback, params[0]);
    },
    function(callback) {
        myFunction(callback, params[1]);
    },
    function(callback) {
        myFunction(callback, params[2]);
    },
]);

显然数组要大得多,将它们包装到循环中会很方便:

var functionsArray = [];

for (var i = 0; i < params.length; ++i) {
    functionsArray.push(
        function(callback) {
           myFunction(callback, params[i]);
        }
     );
 }

 async.series(functionsArray);

唉,这种技术让 jshint 对在数组中定义函数感到抓狂,我明白为什么它不起作用。 i 在调用时将是一个固定值,并且不会被捕获为一个值。

如何创建一组参数位于数组中的函数,这样我就不必显式定义每个函数。

我愿意使用异步中的其他功能。此外,这些函数是高度异步的,因此使用 async.series()

最佳答案

您可能需要 async.eachasync.eachSeries (第一个并行工作):

async.eachSeries(params, function(param, callback) {
  myFunction(callback, param);
}, function(err) {
  // Put code that needs to run when its all finished here
})

不过,这可能会更容易。如果 myFunction 最后使用回调获取参数(这是 Node.js 中的规范),您可以删除额外的匿名函数:

async.eachSeries(params, myFunction, function(err) {
  // Put code that needs to run when its all finished here
})

如果您使用回调最后签名编写函数,它们将更有可能与 Node.js 库很好地配合。

Alas, this technique makes jshint freak out about defining a function in an array and I understand why it won't work.

我假设你的意思是“在循环中定义一个函数”?如果是这样,这是因为定义函数相当昂贵,并且 jshint 不鼓励——而不是因为它不起作用。它还可能认识到 i 不会是您想要的 - 由于 javascript 闭包的工作方式,它将是最终值。一般来说,您应该避免在循环中定义函数,但您可以使用 IIFE(立即调用函数表达式)来避免 i 问题:

for (var i = 0; i < params.length; ++i) {
    (function(i) {
        functionsArray.push(
            function(callback) {
                myFunction(callback, params[i]);
            }
        );
    })(i);
}

关于node.js - 如何基于索引创建带有参数的函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20942995/

相关文章:

node.js - 电子邮件 ID 搜索在 mongodb 全文搜索中不起作用

c++ - std::async 函数串行运行

javascript - 在 Node.js 和 sails.js 中链接异步函数

.net - F# STA 线程异步

javascript - 在 API 帖子中注册用户时设置电子邮件和用户名的多重验证

javascript - NodeJS - 写入文件有时会完成

node.js - 为什么我的 Express 路由处理程序没有 req.body 值?

javascript - 代理类的 TypeError - TypeError : 'set' on proxy: trap returned truish for property

ios - 当其中一个是动画时,等待 iOS 中的两个完成的任务?

c# - 如何异步这个长时间运行的方法?