在jquery中将数据加载到映射中不能一致地工作
Loading data into a map within a jquery does not work consistenty
在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之后键入的任何函数。视图,将异步执行!
相关文章:
- 用javascript将script元素附加到头部;铬不能工作
- 为什么jQuery代码段在没有IFrame的情况下可以工作,而在有IFrame时却不能工作
- 为什么当async标志设置为false时,xmlhttprequest中的代码可以工作,而当它设置为true时却不能工作
- 引导程序's的javascript在本地工作,但在部署到服务器时不能工作
- JQuery脚本没有'Don’我不能工作两次
- "npm运行构建:css"不能工作,而当我自己运行脚本时是可以的
- ng样式在与的预标记中!重要的是不能工作
- angularjs 控制器在指令中使用控制器作为不能工作
- jQuery LightSlider不能工作,但在JSFiddle中工作得很好
- Javascript - 我如何让一个语句工作一次,如果它已经工作了 1 次,则不能工作,然后再次工作
- 我的查询获胜'因为一个剧本,它不能工作(它以错误的方式工作)!?但为什么呢?SESSIONS和PHP
- 我的Javascript代码没有'铬不能工作
- 使用JQuery调整图像大小和重新排列图像;第一次装载时不能工作
- 为什么不是'这个Javascript计算器不能工作
- Javascript在窗口中返回.onbeforeunload不会'铬不能工作
- Javascript代码包含在html中时可以工作,但单独加载/注入时则不能工作
- 简单的jquery选择器不会;铬不能工作
- 为什么不'这个Javascript函数不能工作
- 为什么不'这个js数组函数不能工作
- 视口比例;方向改变后不能工作