在jquery中将数据加载到映射中不能一致地工作

Loading data into a map within a jquery does not work consistenty

本文关键字:不能 工作 映射 jquery 数据 加载      更新时间:2023-09-26

在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,是"turboapp.js"的一部分:

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");
}

用于获取存储在"values"中的选定键。对于这些键,视图中的数据值应该存储在PMdata中。实际上,这段代码连接了两个文档的数据。如能提供建议,我将不胜感激。

当我正常运行这个时,在"值"中有两个条目,我得到"Values1:未定义'n Values2:未定义'n"作为第一个警报,以及第二个警报的良好数据。

当我在firefox调试器下运行此命令,并在警报处设置断点时,两个警报都显示了完美的数据!

怎么回事?

谢谢,Gustavo泰雷兹

这个问题至少有两种解决方案。两者都涉及在jQuery AJAX调用完成后采取行动。

第一个解决方案,将for循环移动到ajaxStop中,如下所示:

    $(document).ajaxStop(function () { for (i in values) { ... } });
第二种方法是使用:
    $.when( db.view( ... ) ).then(function () { for (i in values) { ... } });

我不确定第二种方法是否会起作用,只是因为jQuery与couchapp版本不兼容。但原则上这两种方法都可以。

上面的问题确实是由于db.view的异步操作。就我所知,解决方案是将循环移动到success函数的末尾,如下所示:

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

将添加一个新函数(doWorkFunction)。这就强制了HTTP get数据处理之间的同步。在db之后键入的任何函数。视图,将异步执行!