JQuery/JavaScript - 时间问题
JQuery/JavaScript - Timing problems
我创建了一个 class,我试图实例化它以查看它是否按照我想要的方式处理,并且它工作正常。
实际上,没有我想要的那么好,check[i].id()
只会在我在 each
循环暂停控制台时出现在控制台中。
不然什么都不炫耀check
就是undefined
。我不太明白问题出在哪里,这是我第一次遇到这种时序问题。我想是不是我的AJAX请求太慢了,难道不是要等计算再填check
var吗?
这是代码,为了清晰起见,我对其进行了一些修改:
var Form = function(formSelector, buttonsSelector) {
var id;
return {
// Index of specific form
setId: function(val) {
(!isNaN(val)) ? id = val: console.log('Id must be integer')
},
id: function() {
return id
},
// Get selectors
formSelector: function() {
return formSelector
},
buttonsSelector: function() {
return buttonsSelector
},
// Get all DOM elements
getAll: function() {
return $(formSelector)
},
// Get id related elements
get: function() {
return $(this.getAll()).get(id)
},
buttons: function() {
var buttons = $(this.get()).find(buttonsSelector);
var elements = [];
var proceed = $.ajax({
url: 'myURL.php',
dataType: 'json'
}).done(function(data) {
$(buttons).each(function(i) {
if ((data.id()).includes($(buttons[i]).attr('id'))) {
var element = new Buttons($(buttons[i]), data[i].id);
elements.push(element);
}
});
return true;
});
if (proceed) return elements;
}
}
}
$(function() {
var test = new Form('.whatever', '.whatever2');
var check = test.buttons();
$(check).each(function(i) {
console.log(check[i].id());
});
});
谢谢!
例如,在您的 buttons
方法中接受回调,如下所示
//.. rest class as is, only buttons method cahnges
buttons: function(callback) {
var buttons = $(this.get()).find(buttonsSelector);
var elements = [];
var proceed = $.ajax({
url: 'myURL.php',
dataType: 'json'
}).done(function(data) {
$(buttons).each(function(i) {
if ((data.id()).includes($(buttons[i]).attr('id'))) {
var element = new Buttons($(buttons[i]), data[i].id);
elements.push(element);
}
});
if (callback) callback(elements);
return true;
});
}
那么你可以这样做:
$(function() {
var test = new Form('.whatever', '.whatever2');
test.buttons(function(elements){
$(elements).each(function(i) {
console.log(elements[i].id());
});
});
});
ajax 调用(以及 javascript 中的许多其他进程)是 异步的 ,这意味着在某个时间开始并在另一个时间结束, 而执行 不会 暂停等待它完成,然后再继续程序流中的下一条语句。
发生这种情况的原因有很多,例如进程需要查询一些不能立即使用的资源等等。因此,在启动流程和返回结果方面会有一些延迟。
为了在等待时NOT BLOCK当前执行线程,进程变为异步并继续执行(这就是为什么return
不等待加载结果而是 returns 空数组)。
因此需要一种方法来在准备就绪时回调 调用者返回结果。因此 callbacks and/or promises 用于处理这种类型的异步编程。回调 不会像您想象的那样 暂停执行,而是在结果准备好时调用它,因此通过回调函数调用原始调用者并将结果作为参数传递。了解一下异步 javascript、回调和承诺,了解其含义以及如何使用它们(参见上文 link)。
我创建了一个 class,我试图实例化它以查看它是否按照我想要的方式处理,并且它工作正常。
实际上,没有我想要的那么好,check[i].id()
只会在我在 each
循环暂停控制台时出现在控制台中。
不然什么都不炫耀check
就是undefined
。我不太明白问题出在哪里,这是我第一次遇到这种时序问题。我想是不是我的AJAX请求太慢了,难道不是要等计算再填check
var吗?
这是代码,为了清晰起见,我对其进行了一些修改:
var Form = function(formSelector, buttonsSelector) {
var id;
return {
// Index of specific form
setId: function(val) {
(!isNaN(val)) ? id = val: console.log('Id must be integer')
},
id: function() {
return id
},
// Get selectors
formSelector: function() {
return formSelector
},
buttonsSelector: function() {
return buttonsSelector
},
// Get all DOM elements
getAll: function() {
return $(formSelector)
},
// Get id related elements
get: function() {
return $(this.getAll()).get(id)
},
buttons: function() {
var buttons = $(this.get()).find(buttonsSelector);
var elements = [];
var proceed = $.ajax({
url: 'myURL.php',
dataType: 'json'
}).done(function(data) {
$(buttons).each(function(i) {
if ((data.id()).includes($(buttons[i]).attr('id'))) {
var element = new Buttons($(buttons[i]), data[i].id);
elements.push(element);
}
});
return true;
});
if (proceed) return elements;
}
}
}
$(function() {
var test = new Form('.whatever', '.whatever2');
var check = test.buttons();
$(check).each(function(i) {
console.log(check[i].id());
});
});
谢谢!
例如,在您的 buttons
方法中接受回调,如下所示
//.. rest class as is, only buttons method cahnges
buttons: function(callback) {
var buttons = $(this.get()).find(buttonsSelector);
var elements = [];
var proceed = $.ajax({
url: 'myURL.php',
dataType: 'json'
}).done(function(data) {
$(buttons).each(function(i) {
if ((data.id()).includes($(buttons[i]).attr('id'))) {
var element = new Buttons($(buttons[i]), data[i].id);
elements.push(element);
}
});
if (callback) callback(elements);
return true;
});
}
那么你可以这样做:
$(function() {
var test = new Form('.whatever', '.whatever2');
test.buttons(function(elements){
$(elements).each(function(i) {
console.log(elements[i].id());
});
});
});
ajax 调用(以及 javascript 中的许多其他进程)是 异步的 ,这意味着在某个时间开始并在另一个时间结束, 而执行 不会 暂停等待它完成,然后再继续程序流中的下一条语句。
发生这种情况的原因有很多,例如进程需要查询一些不能立即使用的资源等等。因此,在启动流程和返回结果方面会有一些延迟。
为了在等待时NOT BLOCK当前执行线程,进程变为异步并继续执行(这就是为什么return
不等待加载结果而是 returns 空数组)。
因此需要一种方法来在准备就绪时回调 调用者返回结果。因此 callbacks and/or promises 用于处理这种类型的异步编程。回调 不会像您想象的那样 暂停执行,而是在结果准备好时调用它,因此通过回调函数调用原始调用者并将结果作为参数传递。了解一下异步 javascript、回调和承诺,了解其含义以及如何使用它们(参见上文 link)。