打开设备时 Pouchdb 查询不过滤 KEY
Pouchdb query not filtering KEY when turning on the device
你好,我有这个 pouchdb 查询:
function(test, key){
var temp = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
var day = [];
$q.when(cigdb.query('learnIndex/by_data_type',{key: key, include_docs : true})).then(function(res){
$q.all(res.rows.map(function(row){
console.log(row.doc);
day.push(row.doc.day);
return temp[row.doc.hour]++;
}));
}).then(function(te){
day = day.unique();
console.log(day);
test.splice(0,24);
for(var i = 0; i<24; i++){
if(day.length > 0){
test.push(temp[i]/day.length);
}else{
test.push(temp[i]);
}
}
console.log(test);
return test;
}).catch(function(err){
console.log(err);
});
},
在浏览器上运行良好,但在设备上调试时 (android)
它会跳过部分代码。
在设备上执行直到
$q.all(...)
然后它完全忽略块:
console.log(row.doc);
day.push(row.doc.day);
return temp[row.doc.hour]++;
并继续执行承诺 .then(function(te)
因为没有任何问题
obs:我第一次使用 js angular 和 ionic 不太熟悉
感谢您的帮助
编辑:
我已经尝试过 Promise.all(...)
并在 $q.all(...) and Promise.all(...)
之前加上 return
然后所有这些都在浏览器上工作,但在设备上问题是一样的。
edit2:如果我在 $q.all()
之前发送 console.log(res)
,那么在深入挖掘之后 returns:
Object {total_rows: 32, offset: 0, rows: Array[0]}
offset: 0
rows: Array[0]
total_rows: 32
__proto__: Object
在浏览器上我有:
Object {total_rows: 11, offset: 0, rows: Array[10]}
offset: 0
rows: Array[10]
total_rows: 11
__proto__: Object
出于某种原因 pouchdb 未填充 row
edit3:
更改代码:
q.when(cigdb.query('learnIndex/by_data_type',{key: key, include_docs : true})).then(function(res){
$q.all(res.rows.map(function(row){
day.push(row.doc.day);
return temp[row.doc.hour]++;
}));
为:
$q.when(cigdb.query('learnIndex/by_data_type',{include_docs : true})).then(function(res){
return $q.all(res.rows.map(function(row){
if(row.doc.data_type === key){
day.push(row.doc.day);
return temp[row.doc.hour]++;
}
}));
使它工作,但现在我不明白为什么 key
没有按照设备上的预期进行过滤
是什么使查询变得无用,因为如果我必须以任何方式实现过滤,我可以使用简单的 alldocs
。
正如其他人所说,您需要在 $q.all()
之前添加 return
。您可能想阅读这篇关于 promises 的文章以了解常见的反模式:We have a problem with promises.
至于 key
问题,这取决于 by_data_type
的 map
函数在做什么。无论 emit()
的第一个参数是什么,这就是您的密钥。如果需要调试,那么可以省略 key
参数并检查结果上的 rows
对象。每行将包含一个 key
对象,因此您可以看到键是什么。
您可能还想查看 pouchdb-find。这要容易得多,特别是如果您的地图功能非常简单。
我在使用 sqlite-legacy 插件时遇到了同样的问题,并在 instantiating/creating 数据库时使用 { androidDatabaseImplementation: 2 }
标志解决了这个问题。
你好,我有这个 pouchdb 查询:
function(test, key){
var temp = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
var day = [];
$q.when(cigdb.query('learnIndex/by_data_type',{key: key, include_docs : true})).then(function(res){
$q.all(res.rows.map(function(row){
console.log(row.doc);
day.push(row.doc.day);
return temp[row.doc.hour]++;
}));
}).then(function(te){
day = day.unique();
console.log(day);
test.splice(0,24);
for(var i = 0; i<24; i++){
if(day.length > 0){
test.push(temp[i]/day.length);
}else{
test.push(temp[i]);
}
}
console.log(test);
return test;
}).catch(function(err){
console.log(err);
});
},
在浏览器上运行良好,但在设备上调试时 (android) 它会跳过部分代码。
在设备上执行直到
$q.all(...)
然后它完全忽略块:
console.log(row.doc);
day.push(row.doc.day);
return temp[row.doc.hour]++;
并继续执行承诺 .then(function(te)
因为没有任何问题
obs:我第一次使用 js angular 和 ionic 不太熟悉
感谢您的帮助
编辑:
我已经尝试过 Promise.all(...)
并在 $q.all(...) and Promise.all(...)
然后所有这些都在浏览器上工作,但在设备上问题是一样的。
edit2:如果我在 $q.all()
之前发送 console.log(res)
,那么在深入挖掘之后 returns:
Object {total_rows: 32, offset: 0, rows: Array[0]}
offset: 0
rows: Array[0]
total_rows: 32
__proto__: Object
在浏览器上我有:
Object {total_rows: 11, offset: 0, rows: Array[10]}
offset: 0
rows: Array[10]
total_rows: 11
__proto__: Object
出于某种原因 pouchdb 未填充 row
edit3:
更改代码:
q.when(cigdb.query('learnIndex/by_data_type',{key: key, include_docs : true})).then(function(res){
$q.all(res.rows.map(function(row){
day.push(row.doc.day);
return temp[row.doc.hour]++;
}));
为:
$q.when(cigdb.query('learnIndex/by_data_type',{include_docs : true})).then(function(res){
return $q.all(res.rows.map(function(row){
if(row.doc.data_type === key){
day.push(row.doc.day);
return temp[row.doc.hour]++;
}
}));
使它工作,但现在我不明白为什么 key
没有按照设备上的预期进行过滤
是什么使查询变得无用,因为如果我必须以任何方式实现过滤,我可以使用简单的 alldocs
。
正如其他人所说,您需要在 $q.all()
之前添加 return
。您可能想阅读这篇关于 promises 的文章以了解常见的反模式:We have a problem with promises.
至于 key
问题,这取决于 by_data_type
的 map
函数在做什么。无论 emit()
的第一个参数是什么,这就是您的密钥。如果需要调试,那么可以省略 key
参数并检查结果上的 rows
对象。每行将包含一个 key
对象,因此您可以看到键是什么。
您可能还想查看 pouchdb-find。这要容易得多,特别是如果您的地图功能非常简单。
我在使用 sqlite-legacy 插件时遇到了同样的问题,并在 instantiating/creating 数据库时使用 { androidDatabaseImplementation: 2 }
标志解决了这个问题。