打开设备时 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_typemap 函数在做什么。无论 emit() 的第一个参数是什么,这就是您的密钥。如果需要调试,那么可以省略 key 参数并检查结果上的 rows 对象。每行将包含一个 key 对象,因此您可以看到键是什么。

您可能还想查看 pouchdb-find。这要容易得多,特别是如果您的地图功能非常简单。

我在使用 sqlite-legacy 插件时遇到了同样的问题,并在 instantiating/creating 数据库时使用 { androidDatabaseImplementation: 2 } 标志解决了这个问题。