【问题标题】:MongooseJS: Getting records using array elements as query and using callbacks not workingMongooseJS:使用数组元素作为查询获取记录并使用回调不起作用
【发布时间】:2013-03-07 03:56:55
【问题描述】:

我有一个这样的邮政编码数组:

zipCodes = [1234, 5678, 1357, 2468];

现在,我需要根据这些邮政编码获取位置。我这样做如下:

locations = [];
zipCodes.forEach(function(zip) {
    Addresses.findOne({ zipCode: zip }, function(error, address) {
        //assuming it is a success
        locations.push(address);
    }
});

//data which works on locations  

问题是在位置上工作的数据(最终)没有所有地址 - 至少在被访问时是这样。如果我延迟 5 到 10 秒(在 zipCodes.forEach() 之后使用 setTimeOut),则位置包含所有地址。
我怀疑的原因是push() 进入位置是异步发生的,而不是最终访问位置时发生的时间。
在不使用 setTimeOut() 的情况下,如何确保所有地址都填写在位置中?

【问题讨论】:

    标签: mongoose


    【解决方案1】:

    你的预感是正确的; findOne 回调异步发生,因此您必须等到它们完成后再处理 locations

    处理此问题的一种方法是使用流控制库,如 async

    locations = [];
    async.each(zipCodes, function(zip, callback) {
      Addresses.findOne({ zipCode: zip }, function(error, address) {
        //assuming it is a success
        locations.push(address);
        callback();
      });
    }, function (err) {
      //data which works on locations 
    });
    

    【讨论】:

    • function(err) 是否包含将在位置调用一次或多次调用数组中的元素的代码?基本上,我打算将位置数据返回给包含上述代码的函数的调用者。所以,我打算在所有地点都返回一次 - 这可以在这里工作吗?
    • @user2104976 作为async.each 的第三个参数的function(err) 回调在所有async.each 函数都调用了它们的回调(这是你想要的)时被调用一次。
    • 哦!那么 callback() 和 function(err) 是两个不同的函数吗?我假设回调()将调用函数(错误)。我很困惑,因为这里的文档github.com/caolan/async#each 对这两个函数使用了相同的名称...
    • @user2104976 是的,它们是独立的函数。 callbackasync 的内部函数,用于跟踪每次迭代的完成时间。
    • 我的理解是callback()不需要定义。我的理解正确吗?还是我应该定义 callback() 函数?
    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 2022-11-30
    • 1970-01-01
    • 2021-08-05
    • 2014-05-02
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多