将数据加载到jquery中的映射中并不一致

时间:2014-08-13 02:48:18

标签: javascript jquery ajax couchapp

在HTML方面:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="Content-Language" content="en" />
<style>
p.serif{font-family:"Times New Roman",Times,serif;}
p.sansserif{font-family:Arial,Helvetica,sans-serif;}
</style>
<link rel="stylesheet" href="style/main.css" type="text/css">   
<title>PDS Jobs</title>
</head>
<script src="/_utils/script/sha1.js"></script>
<script src="/_utils/script/json2.js"></script>
<script src="/_utils/script/jquery.js"></script>
<script src="/_utils/script/jquery.couch.js"></script>
<script src="vendor/couchapp/jquery.couchLogin.js"></script>
<script src="vendor/couchapp/jquery.couchProfile.js"></script>
<script src="script/turboapp.js"></script>

以下代码旨在成为couchapp,并且是&#34; turboapp.js&#34;的一部分:

db = $.couch.db("testdb3");
var PMdata = new Object();
for (i in values) {
    PMdata[values[i]] = new Array();
}
db.view("turbologviewer/pm", {
    reduce : false,
    success : function(data) {
        $(data.rows).each( function (index, item) {
            if (PMdata.hasOwnProperty(item.key[0])) {
                 if (item.key[1] == 0) {
                    PMdata[item.key[0]][0] = item.value;
                 } else if (item.key[1] == 1) {
                    PMdata[item.key[0]][1] = item.value;
                 }
            }
        });
    }
});
for (i in values) {
  alert("Job " + values[i] + "\n" + 
        " Values1: " + PMdata[values[i]][0] + "\n" + 
        "   Values2: " + PMdata[values[i]][1] + "\n");
}

旨在将选定的密钥存储在&#34;值&#34;中。对于这些键,视图中的数据值应该存储在PMdata中。实际上,此代码正在加入两个文档的数据。关于如何做到这一点的任何建议也将不胜感激。

当我正常运行时,在&#34;值&#34;中有两个条目,我得到&#34; Values1:undefined \ n Values2:undefined \ n&#34;对于第一个警报,以及第二个警报的良好数据。

当我在firefox调试器下运行它时,我在警报处设置断点时,两个警报都显示出非常好的数据!

发生了什么事?

谢谢, Gustavo Tellez

2 个答案:

答案 0 :(得分:0)

上面的问题确实是由于db.view的异步操作。我能说的最好的解决方案是在成功函数内部结束循环,如下所示:

    db.view("turbologviewer/pm", {
     reduce : false,
     success : function(data) {
     $(data.rows).each( function (index, item) {
       ...
       doWorkFunction(PMdata);
    });

将添加新功能(doWorkFunction)。这会强制处理HTTP get数据之间的同步。 db.view之后输入的任何函数都将异步执行!

答案 1 :(得分:0)

事实证明,这个问题至少有两个其他解决方案。两者都涉及在jQuery AJAX调用完成后采取行动。

首先解决方案,将for循环移动到ajaxStop中,如下所示:

    $(document).ajaxStop(function () { for (i in values) { ... } });

第二种方法是使用:

    $.when( db.view( ... ) ).then(function () { for (i in values) { ... } });

我不确定第二种方法是否有效,只是因为jQuery vs couchapp版本不兼容。但原则上这两种方法都有效。