异步函数在一次但不是多次调用时有效

麦可

我已经使用async.waterfall展平了嵌套函数,如下所示。

function convertPortfolio(trademarks, fn){
    async.waterfall([function(callback){
        groupByCountry(trademarks, callback)
    },
    function(TMsGroupedByCountry, callback){
        addEUTrademarks(TMsGroupedByCountry['EU'], TMsGroupedByCountry, callback)
    },
    function(revisedGroupByCountry, callback){
        groupTrademarksByStatus(revisedGroupByCountry, callback)

    }], function(err, splitByStatus){
        fn(null, splitByStatus);
    })
}

嵌套替代

function convertPortfolio(trademarks, fn){
    groupByCountry(trademarks, function(err, TMsGroupedByCountry){
        addEUTrademarks(TMsGroupedByCountry['EU'], TMsGroupedByCountry,   function(err, revisedGroupByCountry){
            groupTrademarksByStatus(revisedGroupByCountry, function(err, splitByStatus){
                 fn(null, splitByStatus)
            });
        });
    });
 }

随后,当我将此函数作为另一个函数的一部分调用一次时,它可以完美运行。但是,当我尝试使用与数组上的forEach调用不同的值多次调用该函数时,当嵌套版本可以正常工作时,该函数将无法工作。我无所适从地解释为什么会这样,老实说,我不确定从哪里开始。我的理解是,forEach调用应仅意味着对每个单独的值进行相应的处理并关闭,因此这不是问题。

异步功能正常工作并在此实例中返回值

exports.convertPortfolioAndAddToGeoJSON = function(geojson, trademarks, fn){
   convertPortfolio(trademarks, function(err, revisedTMs){
    addToGeoJson(geojson, revisedTMs, function(err, gj){
        fn(null, gj)
      });
   });
}

但是在这种情况下,不会填充最终目标对象:

exports.convertYearPortfolioAndAddToGeoJSON = function(geojson, trademarks, fn){
  var target = {};
  Object.keys(trademarks).forEach(function(year){
    convertPortfolio(trademarks[year], function(err, revisedTMs){
        addToGeoJson(geojson, revisedTMs, function(err, revisedGeoJSON){
            target[year] = revisedGeoJSON;
            });
        });
    });
    fn(null, target);
  }

在某些时候使用console.log可以表明,在嵌套示例中,返回值是在记录目标对象之前记录的,而在async.waterfall示例中,目标对象是在返回数据可用之前记录的(因此,假设记录目标会导致一个空对象也就不足为奇了。

我认为在每种情况下都存在回调,这意味着仅在完成所有先前处理后才记录目标,但是尽管嵌套替代似乎是这种情况,但异步情况并非如此至少在多次调用时才版本。

任何指导将不胜感激。

更新出于兴趣,这里是使用async.forEach修改的代码:

exports.convertYearPortfolioAndAddToGeoJSON = function(geojson, trademarks, fn){
  var target = {};
  async.forEach(Object.keys(trademarks), function(year, callback){
    async.waterfall([
        async.apply(convertPortfolio, trademarks[year]),
        function(revisedTMs, callback){
            addToGeoJson(geojson, revisedTMs, callback)
        }], 
        function(err, revisedGeoJSON){
            target[year] = revisedGeoJSON;
            callback()
        })
   }, function(err){
       fn(null, target);
   });
}
彼得·里昂

Object.keys(trademarks).forEach是同步的,无法正确跟踪闭包/作用域。您需要在async.forEach(Object.keys(trademarks), function(year, callback)....那里使用,并相应地调整异步控制流。

当您使用带有微小包装函数的模式时,也仅供参考:

function convertPortfolio(trademarks, fn){
  async.waterfall([function(callback){
    groupByCountry(trademarks, callback)
  },

您可以使用async.apply该样板:

function convertPortfolio(trademarks, fn){
  async.waterfall([async.apply(groupByCountry, trademarks),
     ...

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Javascript:JSON请求仅在第一次使用时有效

来自分类Dev

jQuery验证-errorPlacement仅在第一次使用时有效

来自分类Dev

Javascript:JSON请求仅在第一次使用时有效

来自分类Dev

我的剑道级联下拉列表失败了。仅在第一次使用时有效

来自分类Dev

Intent Intents.Insert.ACTION仅在第一次使用时有效?

来自分类Dev

为什么按 Id 对对象列表进行分组仅在第一次调用该函数时有效?

来自分类Dev

具有`getopts`的Bash函数仅在第一次运行时有效

来自分类Dev

QLocale setDefault 仅在第二次调用时有效

来自分类Dev

是否有一种仅调用一次递归函数的有效方法?

来自分类Dev

PHP函数中的javaScript代码仅在首次调用时有效

来自分类Dev

图像RotateFlip仅在直接调用时有效

来自分类Dev

图像RotateFlip仅在直接调用时有效

来自分类Dev

Office 365应用和Angular 2路由仅在第一次使用时有效

来自分类Dev

twitter小部件仅在第一次加载时有效,然后失败

来自分类Dev

文档生成仅在第一次时有效

来自分类Dev

对象搜索仅在第一次时有效

来自分类Dev

切换仅在第一次时有效

来自分类Dev

Sails.js / Waterline .add()和.remove()仅在第二次调用时有效

来自分类Dev

使用jquery序列化上传多个文件仅在第二次调用时有效

来自分类Dev

调用使用观察功能在选择框中显示子类别列表的功能仅在第一次时有效

来自分类Dev

JavaScript在使用Node调用时有效,但仅在从HTML调用时才有效

来自分类Dev

在主体卸载中调用该函数时有效,但在作为另一个函数的一部分调用时不起作用

来自分类Dev

jQuery Mobile listview详细信息页面数据跟踪仅在第一次时有效

来自分类Dev

ListView自动滚动仅在手动滚动到底部一次时有效

来自分类Dev

jQuery Mobile listview详细信息页面数据跟踪仅在第一次时有效

来自分类Dev

存储过程中的临时视图仅在第一次更新时有效

来自分类Dev

第二次运行时有效负载()的Node.js“对象不是函数”

来自分类Dev

AngularJS指令会多次调用而不是一次调用

来自分类Dev

Laravel Fakerr有效的()不应静态调用,但不是

Related 相关文章

  1. 1

    Javascript:JSON请求仅在第一次使用时有效

  2. 2

    jQuery验证-errorPlacement仅在第一次使用时有效

  3. 3

    Javascript:JSON请求仅在第一次使用时有效

  4. 4

    我的剑道级联下拉列表失败了。仅在第一次使用时有效

  5. 5

    Intent Intents.Insert.ACTION仅在第一次使用时有效?

  6. 6

    为什么按 Id 对对象列表进行分组仅在第一次调用该函数时有效?

  7. 7

    具有`getopts`的Bash函数仅在第一次运行时有效

  8. 8

    QLocale setDefault 仅在第二次调用时有效

  9. 9

    是否有一种仅调用一次递归函数的有效方法?

  10. 10

    PHP函数中的javaScript代码仅在首次调用时有效

  11. 11

    图像RotateFlip仅在直接调用时有效

  12. 12

    图像RotateFlip仅在直接调用时有效

  13. 13

    Office 365应用和Angular 2路由仅在第一次使用时有效

  14. 14

    twitter小部件仅在第一次加载时有效,然后失败

  15. 15

    文档生成仅在第一次时有效

  16. 16

    对象搜索仅在第一次时有效

  17. 17

    切换仅在第一次时有效

  18. 18

    Sails.js / Waterline .add()和.remove()仅在第二次调用时有效

  19. 19

    使用jquery序列化上传多个文件仅在第二次调用时有效

  20. 20

    调用使用观察功能在选择框中显示子类别列表的功能仅在第一次时有效

  21. 21

    JavaScript在使用Node调用时有效,但仅在从HTML调用时才有效

  22. 22

    在主体卸载中调用该函数时有效,但在作为另一个函数的一部分调用时不起作用

  23. 23

    jQuery Mobile listview详细信息页面数据跟踪仅在第一次时有效

  24. 24

    ListView自动滚动仅在手动滚动到底部一次时有效

  25. 25

    jQuery Mobile listview详细信息页面数据跟踪仅在第一次时有效

  26. 26

    存储过程中的临时视图仅在第一次更新时有效

  27. 27

    第二次运行时有效负载()的Node.js“对象不是函数”

  28. 28

    AngularJS指令会多次调用而不是一次调用

  29. 29

    Laravel Fakerr有效的()不应静态调用,但不是

热门标签

归档