在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
答案 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版本不兼容。但原则上这两种方法都有效。