Javascript NodeJS生成器从未到达某一行?
我正在使用Javascript NodeJS生成器从未到达某一行?,javascript,node.js,ecmascript-6,generator,co,Javascript,Node.js,Ecmascript 6,Generator,Co,我正在使用co运行一个生成器函数,该函数对数据进行一些刮取和清理。然而,在循环之后,我从未到达代码的某一部分。我的代码是这样的: function*(){ var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db; var db = yield MongoClient.connect( url ); for( var establishment in [ {"establishment_id"
co
运行一个生成器函数,该函数对数据进行一些刮取和清理。然而,在循环之后,我从未到达代码的某一部分。我的代码是这样的:
function*(){
var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db;
var db = yield MongoClient.connect( url );
for( var establishment in [ {"establishment_id": 16} ] ){
var establishment_type = establishment.id;
var response = yield getRestaurants( establishment_type );
var restaurants = JSON.parse( response.body ).restaurants;
// here we create our restaurants in "saveable" form
var saveableRestaurants = [];
for(var i = 0; i < restaurants.length; i++){
var saveableRestaurant = restaurants[i].restaurant;
saveableRestaurant._id = restaurants[i].restaurant.R.res_id;
// Remove unwanted fields
//... code removed for brevity ...
// convert cuisine string into its appropriate id form
var cuisines = saveableRestaurant.cuisines.split(",");
var ids = [];
for( var i = 0; i < cuisines.length; i++ ){
console.log("LOOKING UP ID FOR ", cuisines[i]);
var match = yield db.collection(CUI).findOne({"cuisine_name":cuisines[i].trim()});
console.log("ID FOR ", cuisines[i], " IS", match.cuisine_id);
ids.push( id );
}
// I NEVER REACH THIS LINE!!!!
console.log( "ALL IDS ", ids );
}
}
db.close();
}
函数*(){
var url=“mongodb://”+config.host+:“+config.port+”/“+config.db;
var db=yield MongoClient.connect(url);
对于(在[{“设置\设置id:16}]中设置var){
风险值建立类型=建立id;
var响应=收益率(机构类型);
var restaurants=JSON.parse(response.body).restaurants;
//在这里,我们以“可保存”的形式创建餐厅
var saveableRestaurants=[];
对于(变量i=0;i<0.length;i++){
var saveableRestaurant=restaurants[i]。restaurant;
saveableRestaurant.\u id=restaurants[i].restaurant.R.resu id;
//删除不需要的字段
//…为简洁起见,已删除代码。。。
//将字符串转换为其相应的id形式
var cuisines=saveableRestaurant.cuisines.split(“,”);
var-id=[];
对于(变量i=0;i
我从未在函数末尾看到console语句您正在打开db连接,并且正在尝试使用db连接进行操作,因此您可以尝试使用async。在完成每个功能后,您可以关闭连接,我看到问题就在那里。您正在打开db连接,并且正在尝试使用db连接进行操作,因此您可以尝试使用async。在完成每个功能后,您可以关闭连接,我发现这就是问题所在。很可能存在您没有注意到的异步异常。你应该使用
function*() {
var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db;
var db = yield MongoClient.connect( url );
try {
for (var establishment of [ {"establishment_id": 16} ]) {
var establishment_type = establishment.id;
var response = yield getRestaurants( establishment_type );
var restaurants = JSON.parse( response.body ).restaurants;
// here we create our restaurants in "saveable" form
var saveableRestaurants = [];
for (var i = 0; i < restaurants.length; i++) {
var saveableRestaurant = restaurants[i].restaurant;
saveableRestaurant._id = restaurants[i].restaurant.R.res_id;
// Remove unwanted fields
//... code removed for brevity ...
// convert cuisine string into its appropriate id form
var cuisines = saveableRestaurant.cuisines.split(",");
var ids = [];
for (var i = 0; i < cuisines.length; i++) {
console.log("LOOKING UP ID FOR ", cuisines[i]);
var match = yield db.collection(CUI).findOne({"cuisine_name":cuisines[i].trim()});
console.log("ID FOR ", cuisines[i], " IS", match.cuisine_id);
ids.push( id );
}
console.log( "ALL IDS ", ids );
}
}
} finally {
db.close();
}
}
函数*(){
var url=“mongodb://”+config.host+:“+config.port+”/“+config.db;
var db=yield MongoClient.connect(url);
试一试{
对于(var建立[{“建立id”:16}]){
风险值建立类型=建立id;
var响应=收益率(机构类型);
var restaurants=JSON.parse(response.body).restaurants;
//在这里,我们以“可保存”的形式创建餐厅
var saveableRestaurants=[];
对于(变量i=0;i<0.length;i++){
var saveableRestaurant=restaurants[i]。restaurant;
saveableRestaurant.\u id=restaurants[i].restaurant.R.resu id;
//删除不需要的字段
//…为简洁起见,已删除代码。。。
//将字符串转换为其相应的id形式
var cuisines=saveableRestaurant.cuisines.split(“,”);
var-id=[];
对于(变量i=0;i
另外,不要忘记在由
co
返回的承诺上添加一个.catch(e=>console.error(e))
,很可能存在您没有注意到的异步异常。你应该使用
function*() {
var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db;
var db = yield MongoClient.connect( url );
try {
for (var establishment of [ {"establishment_id": 16} ]) {
var establishment_type = establishment.id;
var response = yield getRestaurants( establishment_type );
var restaurants = JSON.parse( response.body ).restaurants;
// here we create our restaurants in "saveable" form
var saveableRestaurants = [];
for (var i = 0; i < restaurants.length; i++) {
var saveableRestaurant = restaurants[i].restaurant;
saveableRestaurant._id = restaurants[i].restaurant.R.res_id;
// Remove unwanted fields
//... code removed for brevity ...
// convert cuisine string into its appropriate id form
var cuisines = saveableRestaurant.cuisines.split(",");
var ids = [];
for (var i = 0; i < cuisines.length; i++) {
console.log("LOOKING UP ID FOR ", cuisines[i]);
var match = yield db.collection(CUI).findOne({"cuisine_name":cuisines[i].trim()});
console.log("ID FOR ", cuisines[i], " IS", match.cuisine_id);
ids.push( id );
}
console.log( "ALL IDS ", ids );
}
}
} finally {
db.close();
}
}
函数*(){
var url=“mongodb://”+config.host+:“+config.port+”/“+config.db;
var db=yield MongoClient.connect(url);
试一试{
对于(var建立[{“建立id”:16}]){
风险值建立类型=建立id;
var响应=收益率(机构类型);
var restaurants=JSON.parse(response.body).restaurants;
//在这里,我们以“可保存”的形式创建餐厅
var saveableRestaurants=[];
对于(变量i=0;i<0.length;i++){
var saveableRestaurant=restaurants[i]。restaurant;
saveableRestaurant.\u id=restaurants[i].restaurant.R.resu id;
//删除不需要的字段
//…为简洁起见,已删除代码。。。
//将字符串转换为其相应的id形式
var cuisines=saveableRestaurant.cuisines.split(“,”);
var-id=[];
对于(变量i=0;i
另外,不要忘记在由
co
返回的承诺上添加一个.catch(e=>console.error(e))
,在浏览了MongoDB文档之后,我找到了解决方案:
var matches = db.collection( CUI ).find({"cuisine_name" : { "$in" : cuisines }});
while( yield matches.hasNext() ){
var match = yield matches.next();
ids.push( match.cuisine_id );
}
在浏览了MongoDB文档之后,我找到了解决方案:
var matches = db.collection( CUI ).find({"cuisine_name" : { "$in" : cuisines }});
while( yield matches.hasNext() ){
var match = yield matches.next();
ids.push( match.cuisine_id );
}
mongo模块是异步的。您的db在发电机启动之前关闭yield@SterlingArcher那么出路是什么呢?我没有在
co
中看到finally()
或done()
:我用蓝鸟和巴贝尔解决了这个问题。Bluebird用于Promission,babel用于ES7等待/异步。下面是我如何(在帮助下)与co合作的一个例子,你必须做出承诺,然后像平常一样使用。然后等等。它不会使异步逻辑消失。@KevinB如果我在中将db.close()
移动到它自己的函数中,那么()
,这会解决问题吗?抱歉,如果我的问题是基本的,mongo模块是异步的。您的数据库在生成器ca之前关闭