Tôi đang học nút, diễn đạt, mongo và, trong quá trình này, javascript. Tôi đang cố gắng để có được một tính năng mà sử dụng rssparser, có được một danh sách các câu chuyện và lưu chúng vào một cơ sở dữ liệu mongo với mongoose.Gặp sự cố khi lặp qua mảng và lưu vào phần đuôi. Sự cố gọi lại?
Tôi đã kéo RSS hoạt động và tôi đang lặp qua các câu chuyện, đó là mục mà tôi đang gặp sự cố. Tôi muốn 1) kiểm tra xem câu chuyện chưa tồn tại trong cơ sở dữ liệu chưa, và 2) nếu không, hãy lưu nó. Tôi nghĩ rằng tôi đang bị mất theo cách gọi lại được xử lý. Đây là mã hiện tại của tôi, có nhận xét.
rssparser.parseURL(url, options, function(err,out){
// out.items is an array of the items pulled
var items = out.items;
var story;
for (var i=0; i<items.length; i++){
//create a mongoose story
story = new schemas.Stories({
title: items[i].title,
url: items[i].url,
summary: items[i].summary,
published: items[i].published_at
});
//TODO: for testing - these show up correctly.
//If I pull 10 stories, I get 10 entries from here that match
//So "story" is holding the current story
console.log("items[i] is :" + items[i].title);
console.log("story title is : " + story.title);
// setup query to see if it's already in db
var query = schemas.Stories.findOne({
"title" : story.title,
"url" : story.url
});
//execute the query
query.exec(function(err, row){
if(err) console.log("error-query: " + err);
console.log("row: "+ row);
if(!row) {
// not there, so save
console.log('about to save story.title: ' + story.title);
story.save(function (err){
console.log("error in save: " + err);
});
}
});
}
});
Khi điều này chạy, những gì tôi thấy là rất nhiều giao diện điều khiển đầu ra:
Nó bắt đầu hiển thị tất cả những câu chuyện (nhiều bỏ qua):
items[i] is :TSA Drops Plan to Let Passengers Carry Small Knives on Planes
story title is : TSA Drops Plan to Let Passengers Carry Small Knives on Planes
items[i] is :BUILDING COLLAPSE:1 Reportedly Dead, 13 Pulled From Philly Rubble
story title is : BUILDING COLLAPSE:1 Reportedly Dead, 13 Pulled From Philly Rubble
items[i] is :CONTROVERSIAL PAST: Obama's UN Nominee Once Likened US 'Sins' to Nazis'
story title is : CONTROVERSIAL PAST: Obama's UN Nominee Once Likened US 'Sins' to Nazis'
items[i] is :WRITING OUT WRIGHTS: Bill Gives First Powered Flight Nod to Whitehead
story title is : WRITING OUT WRIGHTS: Bill Gives First Powered Flight Nod to Whitehead
items[i] is :BREAKING NEWS: Rice Named to Top Security Post Despite Libya Fallout
story title is : BREAKING NEWS: Rice Named to Top Security Post Despite Libya Fallout
Sau đó, tiếp tục tương tự (nhiều bỏ qua):
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: { title: 'Best Ribs in America',
url: 'http://www.foxnews.com/leisure/2013/06/05/10-best-ribs-in-america/',
published: 1370463800000,
_id: 51af9f881995d40425000023,
__v: 0 }
Nó lặp lại tiêu đề "sắp lưu" (câu chuyện cuối cùng trong nguồn cấp dữ liệu) và nó lưu câu chuyện một lần, giống như hàng cuối cùng hiển thị.
Đầu ra console.log chỉ hiển thị cho tôi, tất cả đầu ra tiêu đề câu chuyện ở trên cùng, sau đó tất cả nội dung từ bên trong cuộc gọi query.exec() ở dưới cùng.
Any help is appreciated ...
Tôi đã triển khai phương pháp dọn dẹp và nó hoạt động rất tốt, cảm ơn bạn. Vậy vấn đề của tôi chỉ là vấn đề thời gian? tức là, tất cả các mục trong out.items đã được lặp lại trước khi cuộc gọi lại đó được thực thi (do đó câu chuyện được đặt thành out.item cuối cùng)? – Mike
Vấn đề của bạn phải làm với phạm vi, dẫn đến tình trạng chạy đua. khi vòng lặp for lặp qua, chỉ có một tham chiếu đến 'story', và nó được ghi đè mỗi khi bạn lặp qua mảng đó. Nếu chức năng exec đã được thực hiện ngay lập tức, đồng bộ, mã của bạn sẽ hoạt động tốt, nhưng vì tất cả các cuộc gọi đến gọi lại trong exec xảy ra sau khi vòng lặp for đã kết thúc, tất cả chúng đều là trường hợp cuối cùng của câu chuyện được gán cho biến câu chuyện. khi chúng được "đóng cửa" với một hàm, tất cả chúng đều có thể hiện riêng của 'câu chuyện'. đây là một sai lầm rất phổ biến – arnorhs