您好,我有这个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:所以在挖掘了一点之后,如果我在console.log(res)之前发送$q.all(),它将返回:

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

编辑3:

更改代码:

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

最佳答案

正如其他人所说,在return之前需要一个$q.all()。您可能想阅读有关承诺赶上常见反模式的文章:We have a problem with promises

至于key问题,这取决于您mapby_data_type函数在做什么。不管emit()的第一个参数是什么,这都是您的关键。如果需要调试,则可以省略key参数,并检查结果中的rows对象。每行将包含一个key对象,因此您可以看到键是什么。

您可能还想签出pouchdb-find。这要容易得多,尤其是在您的map函数非常简单的情况下。

关于javascript - Pouchdb查询在打开设备时未过滤KEY,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31952298/

10-13 09:54