Nodejsasynchronous数据重复
我在nodejs上有一个asynchronous进程有问题。
我从远程JSON获取一些数据,并将其添加到我的数组中,这个JSON有一些重复的值,我需要检查它是否已经存在于我的数组之前,添加它,以避免数据重复。
我的问题是,当我启动JSON值之间的循环,循环调用下一个值,在最后一个过程完成之前,所以,我的数组充满重复的数据,而不是保持每个types只有一个项目。
看我目前的代码:
BookRegistration.prototype.process_new_books_list = function(data, callback) { var i = 0, self = this; _.each(data, function(book) { i++; console.log('\n\n ------------------------------------------------------------ \n\n'); console.log('BOOK: ' + book.volumeInfo.title); self.process_author(book, function() { console.log('in author'); }); console.log('\n\n ------------------------------------------------------------'); if(i == data.length) callback(); }) } BookRegistration.prototype.process_author = function(book, callback) { if(book.volumeInfo.authors) { var author = { name: book.volumeInfo.authors[0].toLowerCase() }; if(!this.in_array(this.authors, author)) { this.authors.push(author); callback(); } } } BookRegistration.prototype.in_array = function(list, obj) { for(i in list) { if(list[i] === obj) return true; } return false; }
结果是:
[{name: author1 }, {name: author2}, {name: author1}]
我需要:
[{name: author1 }, {name: author2}]
更新:
@Zubbuild议的解决scheme可以很好地处理数组,但不能和sequelize和mysql数据库一起使用。
当我尝试在数据库上保存我的作者列表时,数据被复制,因为系统在完成之前开始保存另一个数组元素以保存最后一个数组元素。
这种情况下的正确模式是什么?
我使用数据库的代码是:
BookRegistration.prototype.process_author = function(book, callback) { if(book.volumeInfo.authors) { var author = { name: book.volumeInfo.authors[0].toLowerCase() }; var self = this; models.Author.count({ where: { name: book.volumeInfo.authors[0].toLowerCase() }}).success(function(count) { if(count < 1) { models.Author.create(author).success(function(author) { console.log('SALVANDO AUTHOR'); self.process_publisher({ book:book, author:author }, callback); }); } else { models.Author.find({where: { name: book.volumeInfo.authors[0].toLowerCase() }}).success(function(author) { console.log('FIND AUTHOR'); self.process_publisher({ book:book, author:author }, callback); }); } }); // if(!this.in_array(this.authors, 'name', author)) { // this.authors.push(author); // console.log('AQUI NO AUTHOR'); // this.process_publisher(book, callback); // } } }
我怎样才能避免在asynchronous过程中的数据重复?
这是因为你比较不同的对象,结果总是false
。
仅用于在控制台中input实验:
var obj1 = {a:1}; var obj2 = {a:1}; obj1 == obj2; //false
当比较对象(以及数组)时,仅当obj1
链接到obj2
时才会导致结果为true
:
var obj1 = {a:1}; var obj2 = obj1; obj1 == obj2; //true
由于您在每个process_author
调用中创build了新的author
对象,所以在比较时总是得到false
。
在你的情况下,解决scheme将是比较每本书的name
属性:
BookRegistration.prototype.in_array = function(list, obj) { for(i in list) { if(list[i].name === obj.name) return true; } return false; }
编辑(与您的评论问题有关):
我会重写process_new_books_list
方法如下:
BookRegistration.prototype.process_new_books_list = function(data, callback) { var i = 0, self = this; (function nextBook() { var book = data[i]; if (!book) { callback(); return; } self.process_author(book, function() { i++; nextBook(); }); })(); }
在这种情况下,下一个process_author
不是马上被调用(就像_.each
),但是在执行callback之后,所以在程序中有后果。
不知道这是否工作。
对不起我的英文,我不是以英语为母语的人