【问题标题】:The best way to do a Callback after For in NodeJS?在 NodeJS 中执行 For 之后的回调的最佳方法是什么?
【发布时间】:2015-04-24 01:23:34
【问题描述】:

我已经使用 PHP 开发多年,现在我正在尝试学习 NodeJS,但我遇到了异步函数的问题...

我在 NodeJS 中有这个功能(source 是一个用户数组):

//userformat.js

var age = module.exports.age = function(date){

  var diff = new Date - new Date(date);
  var diffdays = diff / 1000 / (60 * 60 * 24);
  var age = Math.floor(diffdays / 365.25);

  return age;

}

...etc.

//index.js

function format(source, me, callback){

    var len = source.length

    for (var i = 0; i < len; i++){

        source[i]['_age'] = userFormat.age(source[i]['birthday']);
        source[i]['_rating'] = userFormat.rating(source[i]['votes']);
        source[i]['_is_followed'] = userFormat.followed(source[i]['fllws'], me);

    }

    callback(null, source);

}

我知道 Node 中的函数错误,因为函数可能在 for() 中的函数完成之前调用回调,并且数组中的值可能未定义,因为这就是我使用回调更改函数的原因:

//userformat.js

var age = module.exports.age = function(date, callback){

      var diff = new Date - new Date(date);
      var diffdays = diff / 1000 / (60 * 60 * 24);
      var age = Math.floor(diffdays / 365.25);

      callback(age);

    }
...etc.

//index.js

function format(source, me, callback){

    var len = source.length

    for (var i = 0; i < len; i++){

        userFormat.age(source[i]['birthday'], function(resul){

            source[i]['_age'] = resul;

            userFormat.rating(source[i]['votes'], function(resul){

                source[i]['_rating'] = resul;

                userFormat.followed(source[i]['fllws'], me, function(resul){

                    source[i]['_is_followed'] = resul;

                    //Callback
                    if (i == len-1){
                        callback(null, source);
                    }

                })

            })


        })

    }

}

说得对吗?我有另一种更高效或更优雅的方法吗?

非常感谢!

【问题讨论】:

    标签: node.js for-loop asynchronous callback


    【解决方案1】:

    我认为你误解了 nodeJS 中异步的概念。你的代码不是异步的,你的回调总是在循环之后被调用。

    检查这个问题:how do i create a non-blocking asynchronous function in node.js?

    【讨论】:

    • 是的。我知道回调是在循环之后调用的,但是循环内的变量是异步设置的。 userFormat.age()、userFormat.rating() 和 userFormat.followed() 是返回值的函数。
    • 你能展示一下 userFormat 方法到底在做什么吗?
    • 我已经编辑了我的第一个问题...对不起,异步方法对我来说很困惑...
    • 您的方法不是异步的(至少是 age 方法)。阅读我给你的链接中的解释,它应该可以帮助你理解它。如果您确实需要异步运行您的方法,我认为您应该使用 process 对象 (nodejs.org/api/process.html) 和 nextTick 方法。
    • 谢谢亚瑟,我要多学习:)。我会阅读链接,非常有趣
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多