gpt4 book ai didi

javascript - 如何在另一个异步 `each` 方法(NodeJS)中调用异步方法?

转载 作者:可可西里 更新时间:2023-11-01 10:35:06 25 4
gpt4 key购买 nike

如何在另一个异步 each 方法 (NodeJS) 中调用异步方法?

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

那么,让我们尝试实现我们的 deleteAll 方法(实际上它是来自 node-mongodb-native 驱动程序的真实 API):

deleteAll = function(selector, callback){
collection.find(selector).each(function(err, doc){
if(err){
callback(err)
}else{
if(doc === null){
// each returns null when there's no more documents, we are finished.
callback(null)
}else{
doSomeBusinessLogicBeforeDelete(doc)

// How to delete it using asynchronous `remove` method?
collection.remove({_id: doc._id}, function(err){
// What to do with this callback?
// And how to make `each` wait untill we
// deleting this record?
???
})
}
}
})
}

实际上有一种方法可以做到这一点 - 使用 collection.nextObject 方法而不是 collection.each,但我想知道是否可以使用 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);
}
};

最佳答案

尝试这样的事情。

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');
})
}
}
})
}

关于javascript - 如何在另一个异步 `each` 方法(NodeJS)中调用异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8853499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com