0
DBにUserArticleを追加するJS関数があります(mongooseとNodeJSを使用)。問題はそれが終わりに達していないということです。関数の最後に到達していません
つまり、私は、多くの時間がどの地点に到達し、Provider.findOne
の前か、またはUser.find
の前にあるかを調べようとしました。
var insertUserArticleToAllSubscribers = function (base_ua, providerId) {
var Provider = mongoose.model('Provider');
var User = mongoose.model('User');
var UserArticle = mongoose.model('UserArticle');
Provider.findOne({"twitter_id": providerId}, function (err, provider) {
if (err) {
console.log(err);
return;
}
if (provider) {
User.find({"subscribed": provider._id}, function (err, users) {
if (err) {
console.log (err);
return;
}
if (users) {
for (i in users) {
var ua = new UserArticle ({"user": users[i], "article":base_ua.article, "place":base_ua.place, "read":0, "starred":0});
ua.save(function (err) {
if (err) console.log(err);
logAddedArticle(ua._id, users[i]);
console.log("ArticleAdded!: " + ua._id);
});
}
} else {
console.log("No users");
}
})
}
})
}
エラーを投げずに機能の最後に到達しない理由はわかりません。このコードにバグはありますか?
実際、機能の終わりに達することはありますが、ほとんどの場合、機能しないことがあります。
はProvider.findOne()は実際に(できれば安全な仮定)コールバックを呼び出している場合、あなたはおそらく最初if(provider)
呼び出しでelse
を必要とすると仮定すると、あなたに
は正確にあなたが何を意味するか:あなたはこのように変更した場合
おそらく、結果を取得します:
は今、あなたは、この論理構造を持っています関数? findOneとfindの関数は非同期なので、insertUserArticleToAllSubscribersが返されるまで実行されません。 – loganfsmyth