当前位置: 首页 > 面试题库 >

在对象值的异步for循环完成执行后如何调用函数

江新
2023-03-14
问题内容

我想在异步for循环遍历Javascript对象的值完成执行后调用一个函数。我有以下代码

for (course in courses) {
    var url = '...' + courses[course];

    request(url, (function (course) {
        return function (err, resp, body) {
            $ = cheerio.load(body);

            //Some code for which I use object values    
        };
    })(course));
}

问题答案:

这可以在普通JS中完成,但是我建议使用async模块,它是用于处理Node.js中异步代码的最流行的库。例如,使用async.each

var async = require('async');

var courseIds = Object.keys(courses);

// Function for handling each course.
function perCourse(courseId, callback) {
    var course = courses[courseId];

    // do something with each course.
    callback();
}

async.each(courseIds, perCourse, function (err) {
    // Executed after each course has been processed.
});

如果要使用每次迭代的结果,则async.map类似,但是将结果数组传递给回调的第二个参数。

如果您喜欢香草JS,则可以代替async.each

function each(list, func, callback) {
    // Avoid emptying the original list.
    var listCopy = list.slice(0);

    // Consumes the list an element at a time from the left.
    // If you are concerned with overhead in using the shift
    // you can accomplish the same with an iterator.
    function doOne(err) {
        if (err) {
            return callback(err);
        }

        if (listCopy.length === 0) {
            return callback();
        }

        var thisElem = listCopy.shift();

        func(thisElem, doOne);
    }

    doOne();
}

(摘自我前段时间写的要点)

我强烈建议您使用异步库。异步很容易编写,类似async.auto的功能非常出色。



 类似资料:
  • 问题内容: 我在NodeJS中有一个forEach循环,遍历一系列键,然后从Redis异步检索其值。循环和检索完成后,我想返回该数据集作为响应。 我目前的问题是因为数据检索是异步的,发送响应时没有填充我的数组。 如何在我的forEach循环中使用promise或回调,以确保响应与数据一起发送? 问题答案: 我在这里使用Bluebird Promise 。请注意,代码的意图非常清晰并且没有嵌套。 首

  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包:

  • 下面是一个for循环,它将运行最多时间,在该for循环中,我调用GET返回一些需要添加到我的对象中的数据。 在调用行。思想?

  • 您好,我正在使用for循环和异步ajax调用为本地存储创建批处理更新。 我的问题是,即使我的ajax调用还没有成功完成,我的循环仍在继续。 在继续循环之前,我们如何使for循环等待单元成为ajax响应的响应? 任何帮助都很感激。谢谢!!! 下面是我的示例代码:

  • 问题内容: 我创建了一个for循环,该循环循环了元素出现在容器中的次数。for循环从HTML捕获一些数据,并创建一个JSON url,然后将返回一个值。然后应将该值添加到适当位置的HTML中。 问题似乎是for循环在进行所有Ajax调用之前完成,因此仅将最后一个值添加到HTML。我以为可以确保readystate等于4,但是该解决方案不起作用。我还尝试将完整而不是成功用作Ajax事件。有什么见解吗

  • 问题内容: 我有以下代码: 是与Memcached数据库的连接。可以想象,回调函数是异步的,因此可以在for循环已结束时执行。同样,以这种方式调用时,它始终使用for循环的最后一个值。 我用这种方式尝试关闭 但是显然,这再次使用了for循环索引的最后一个值。 我也尝试在for循环之前声明一个函数,如下所示: 然后打电话 但同样没有成功,返回值始终是for循环的最后一个值。 谁能告诉我关闭有错吗?我