我有以下代码示例,我试图包围我的脑袋
$(document).ready(function () {
test("load json", function () {
length = 0; // length = 0
$.getJSON("plugins/form.json", function (data) {
length = data.fields.length; // length = 4
});
ok(length == 4, "length = " + length.toString()); // length = 0? wtf?
});
});
$ .getJSON运行时,'length'变量不会持久存在。我无法弄清楚它是否因为它的异步或因为变量超出了范围。
答案 0 :(得分:3)
如果getJSON方法异步运行,则ok(...行可能会在getJSON返回之前执行...因此长度始终为0 ......
你能不能这样做......
$.getJSON("plugins/form.json", function (data) {
var somelength = data.fields.length;
ok(somelength == 4, "length = " + somelength.tostring());
});
一旦getJSON返回数据,它就会调用ok函数...
答案 1 :(得分:2)
您应该进行异步测试,并且由于您使用的是QUnit,因此您可以使用stop
方法,在getJSON
回调中进行断言,然后恢复以下测试:
$(document).ready(function () {
test("load json", function () {
stop();
$.getJSON("plugins/form.json", function (data) {
var length = data.fields.length;
ok(length == 4, "length == " + length);
start(); // resume tests
});
});
});
或者您可以使用asyncTest
方法代替test
,这会隐式调用stop
:
//...
asyncTest("load json", function () {
$.getJSON("plugins/form.json", function (data) {
var length = data.fields.length;
strictEqual(length, 4, "length");
//...
start(); // resume tests
});
});
//...
答案 2 :(得分:1)
这不是因为范围问题,而是因为此行首先运行
ok(length == 4, "length = " + length.toString());
来自JSON的回调函数
function (data) {
length = data.fields.length; // length = 4
}
您需要将ok(length == 4, "length = " + length.toString());
函数放在$.getJSON
的回调函数中。
答案 3 :(得分:1)
是的,那是因为它是异步的。
test("load json", function () {
// executes first
$.getJSON("plugins/form.json", function (data) {
// executes last (that is, "sometime later")
});
// executes second
});
此外,您应该首次将变量声明为var length
,除非您希望它是全局变量。
答案 4 :(得分:-1)
试试这个 - $(document).ready(function(){
var length = 0; // length = 0
test("load json", function () {
$.getJSON("plugins/form.json", function (data) {
length = data.fields.length; // length = 4
});
ok(length == 4, "length = " + length.toString()); // length = 0? wtf?
});
});