【问题标题】:Is there a better way to do this in node.js?在 node.js 中有没有更好的方法来做到这一点?
【发布时间】:2012-07-18 02:21:38
【问题描述】:

我正在使用 node.js 调用 redis 来获取一些数据。然后需要将数据排序为数组 - 这不是一个昂贵的过程,但我需要一个函数在排序完成后立即异步执行。

如果我在排序代码之后立即编写函数,它将在数组排序完成之前触发。所以我看到了解决这个问题的几种方法:

1) 编写 for() 循环,当前一个循环处于最后一次迭代时,下一个循环开始;最后,放置异步方法以确保它在所有循环完成后运行。

2) 使用 setTimeout()。我对此感到不安,因为看起来可能取决于需要处理的数组的大小,它可能会神奇地过早或过晚触发。

有没有比嵌套 for 循环更好的方法来解决这个问题?

【问题讨论】:

  • 如何异步排序?
  • 你用什么对数组进行排序?您不能只将 onComplete 函数传递给该函数以在排序完成后触发吗?
  • JavaScript 中常规数组的排序是同步的,因此在 sort 之后立即调用的函数不可能将数组视为已排序。可以举个例子吗?

标签: javascript node.js asynchronous


【解决方案1】:

看起来你只是想要reduceRight

arr.reduceRight( function( p, c, i ) {
    // sort
    if ( i === 0 ) {
        // You know you're at the last iteration
        // so you can call whatever async func you want
    }
});

【讨论】:

    【解决方案2】:

    您可以使用 setTimeout() 并将等待时间设置为数组大小的某个函数。不过我很同情你, setTimeout() 似乎很可怕。然而,在这种情况下,它是一种必要的邪恶。

    【讨论】:

      【解决方案3】:

      我很惊讶你用来访问 Redis 的代码没有异步功能,但这应该可以工作:

      var done = false;
      
      function sort(){
         ...
         done = true;
      }
      
      function sortDone(){
         if(done){
            ...
         }else{
            process.nextTick(sortDone);
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        相关资源
        最近更新 更多