Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在另一个异步'each'方法(NodeJS)内部进行异步方法调用?_Javascript_Node.js_Mongodb_Asynchronous_Each - Fatal编程技术网

Javascript 如何在另一个异步'each'方法(NodeJS)内部进行异步方法调用?

Javascript 如何在另一个异步'each'方法(NodeJS)内部进行异步方法调用?,javascript,node.js,mongodb,asynchronous,each,Javascript,Node.js,Mongodb,Asynchronous,Each,如何在另一个异步每个方法(NodeJS)内部进行异步方法调用 具体示例-使用数据库时,我需要删除所有记录。 但我不能只删除整个收藏,我需要一个接一个地销毁所有记录,在删除之前,我需要读取记录,在应用程序中执行一些业务逻辑,然后再删除它 因此,让我们尝试实现我们的deleteAll方法(实际上它是来自NodeMongoDB本机驱动程序的真实API): 实际上有一种方法可以做到这一点——使用collection.nextObject方法而不是collection.each,但我想知道是否可以使用ea

如何在另一个异步
每个
方法(NodeJS)内部进行异步方法调用

具体示例-使用数据库时,我需要删除所有记录。 但我不能只删除整个收藏,我需要一个接一个地销毁所有记录,在删除之前,我需要读取记录,在应用程序中执行一些业务逻辑,然后再删除它

因此,让我们尝试实现我们的
deleteAll
方法(实际上它是来自NodeMongoDB本机驱动程序的真实API):

实际上有一种方法可以做到这一点——使用
collection.nextObject
方法而不是
collection.each
,但我想知道是否可以使用
each
解决这个问题?现在我认为这是不可能的,但也许我错了

更新:每个
方法的来源:

Cursor.prototype.each = function(callback) {
  var self = this;

  if (!callback) {
    throw new Error('callback is mandatory');
  }

  if(this.state != Cursor.CLOSED) {
    process.nextTick(function(){
      // Fetch the next object until there is no more objects
      self.nextObject(function(err, item) {        
        if(err != null) return callback(err, null);

        if(item != null) {
          callback(null, item);
          self.each(callback);
        } else {
          // Close the cursor if done
          self.state = Cursor.CLOSED;
          callback(err, null);
        }

        item = null;
      });
    });
  } else {
    callback(new Error("Cursor is closed"), null);
  }
};

好吧,你写的东西会有用的,尽管不确定这一行:

  if(doc === null){
    // each returns null when there's no more documents, we are finished.
    callback(null)  

因为,我不知道逻辑,但那会起作用的。从技术上讲,函数不会等待,您只需传递另一个函数,该函数将在工作完成时执行。这里所做的是异步和并行的。您还可以查看模块中每个函数和一些其他函数的异步版本。

尝试类似的方法

deleteAll = function(selector, callback){
  // count all documents you need to fire remove for
  var count = collection.filter(function(doc) { return doc === null }).length,
          i = count;

  collection.find(selector).each(function(err, doc){
    if(err){
      callback(err)
    }else{
      if(doc === null){
        callback(null)      
      }else{
        doSomeBusinessLogicBeforeDelete(doc)

        collection.remove({_id: doc._id}, function(err){
          i--;
          if (i <= 0) callback('done');
        })
      }      
    }
  })
}
deleteAll=函数(选择器、回调){
//清点您需要删除的所有文档
var count=collection.filter(函数(doc){return doc==null}).length,
i=计数;
collection.find(选择器)。each(函数(err,doc){
如果(错误){
回调(错误)
}否则{
如果(doc==null){
回调(空)
}否则{
doSomeBusinessLogicBeforeDelete(文档)
删除({u-id:doc.\u-id},函数(err){
我--;

如果(我是这样,在使用node几个月后,我得到了我的问题的答案,下面是异步的一个可能实现(可能有其他类似的实现,但在错误处理方面有细微的差异):


mongo中每个
的实现都是不同的,它不可能进行正确的顺序迭代(也许可以,也许他们心中有不同的设计目标).

你有
每个方法的源代码吗?如果你有,应该很容易找到你。嗯,是的,它可以工作,但是
集合.remove
将并行执行,而不是串行执行,甚至在某些“collection.remove”完成之前,最终的回调可能会触发。
deleteAll = function(selector, callback){
  // count all documents you need to fire remove for
  var count = collection.filter(function(doc) { return doc === null }).length,
          i = count;

  collection.find(selector).each(function(err, doc){
    if(err){
      callback(err)
    }else{
      if(doc === null){
        callback(null)      
      }else{
        doSomeBusinessLogicBeforeDelete(doc)

        collection.remove({_id: doc._id}, function(err){
          i--;
          if (i <= 0) callback('done');
        })
      }      
    }
  })
}
asyncEach(
  function(obj, next){
    // do something with obj
    // call next when You finish and want next object, 
    // You can also pass error into next in case of error.
    console.log(obj)
    next()
  },
  function(err){
    // Will be called when there's no more objects.
  }
)