JavaScript:在另一个函数调用完成后继续函数 编辑:
小提琴应该用来帮助说明我正在尝试做什么和正在发生什么。子选项应填充第二个选项值JavaScript:在另一个函数调用完成后继续函数 编辑:,javascript,jquery,testing,Javascript,Jquery,Testing,小提琴应该用来帮助说明我正在尝试做什么和正在发生什么。子选项应填充第二个选项值 原始问题: 不确定问的最佳方式。我正在创建一个测试脚本来自动填充表单上的输入 它包括一系列下拉框,用于填充onChange事件中的其他select选项。尝试自动填充表单时,子选项没有任何选项 console.clear(); // non-select inputs $(':input:not([type="hidden"],[type="button"])').each(
原始问题: 不确定问的最佳方式。我正在创建一个测试脚本来自动填充表单上的输入 它包括一系列下拉框,用于填充onChange事件中的其他
select
选项。尝试自动填充表单时,子选项没有任何选项
console.clear();
// non-select inputs
$(':input:not([type="hidden"],[type="button"])').each(function(){
$(this).val($(this).attr('name')) // test value is simple input's name
});
// select inputs
var count=0, cutoff=7500;
$('select').each(function(){
var t = $(this);
var c = t.children('option');
while( c.length <= 1 && count < cutoff){
count++;
c = $(this).children('option'); // tried not using the cache'd variable
if (!(count % 10))
console.log(count, c.length, "No Options"); // debugging -- never exists early
setTimeout(function(){},0); // not really doing anything
}
t.val( c.eq(1).val() ); // set value to second option value
t.trigger('change'); // calls the onChange even if it doesnt exist
});
// verify it does have data
console.log($('#sub-select').children('option').length); // does have options
console.clear();
//非选择输入
$(':输入:不是([type=“hidden”],[type=“button”])。每个(函数(){
$(this.val($(this.attr('name'))//测试值是简单输入的名称
});
//选择输入
var计数=0,截止值=7500;
$('select')。每个(函数(){
var t=$(本);
var c=t.children(“期权”);
而(c.length不太确定代码要做什么
但回答另一个函数调用完成后如何继续函数的问题:-
假设您有一个所有异步函数的列表,您可以嵌套它们以继续
到下一个异步函数。。。
异步调用(回调1){
回拨1(回拨2){
回调2(…)
}
}
检查一些优雅的方法来做到这一点
本例按顺序调用所有函数,即使它们是异步的
async.series([
function(callback){
setTimeout(function(){
call_order.push(1);
callback(null, 1);
}, 25);
},
function(callback){
setTimeout(function(){
call_order.push(2);
callback(null, 2);
}, 50);
},
function(callback){
setTimeout(function(){
call_order.push(3);
callback(null, 3,3);
}, 15);
}
1) 使用同步AJAX请求
2) 而不是使用.each use.eq(索引)并按顺序调用它
function FakeEach(idx) {
if(idx >= 7500) return;
var $obj = $('select').eq(idx);
if($obj.length == 0) return;
...
$obj.trigger('change');
window.setTimeout(function() { FakeEach(idx++); }, 0);
}
您的问题是,您正在函数中启动一个AJAX请求,并期望响应在函数结束之前到达。只要您使用异步请求,这种情况就永远不会发生。您必须在处理响应的代码运行之前退出函数。Javascript是单线程的,只要您的函数在运行时,其他代码无法运行
该问题的解决方案是将使用数据的代码放入成功回调函数中,该函数在响应到达后调用。尽管您通常在进行AJAX调用的函数中编写该函数,但它是一个单独的函数,稍后将运行
如果您确实需要与AJAX调用相同功能中的数据,则需要发出同步请求。但是,这对用户体验来说是一个杀手锏,因为整个浏览器在等待响应时都会冻结。您的第一个选择器相当多。它可以简化为:input:not([type=“hidden”],:button)
。从代码和解释来看,这个问题不是很清楚。你应该包括纯Javascript或添加一个jQuery标记。大约80%的Javascript开发人员不会处理jQuery问题。但请记住,大约90%的互联网评论统计数据都是动态生成的。好吧,提问的一种方式是实际提问……这是很难说您可能遇到了什么问题,因为大多数代码似乎根本没有真正的用途。@pimvdb:这包括我不想要的按钮。我确实有一个打字错误(应该提交而不是两次按钮)。问题可能是如何每个()
orders items。但是,如果它是按DOM顺序排列的,这应该不是问题。sub-select的选项基于select的值。因此,查看循环,在select上更改值,然后调用更改事件(调用AJAX,填充sub-select),每个()中的下一个项应该是子选择,我希望等待它填充(具有选项
s)是的,我意识到AJAX位的同步性,但我真的不想弄乱生产代码,因为我只想创建一个测试,自动填充动态填充的元素。我必须相信还有另一种方法,可能是扩展onchange函数。我想你可以做一个setTimeout,让其他操作执行继续,这就是为什么我最初将它放在while
循环中的原因——我认为这工作不太好。在调试时,我确实看到AJAX确实在while
循环处理时返回。@vol7ron:即使响应在循环运行时到达,处理响应的代码也不能运行。您可以模拟使用超时的AJAX调用的异步部分。超时回调代表AJAX调用的成功回调:感谢您的帮助,我在:,创建了一个新问题,因为我的原始问题可能会吓坏/迷惑人们。我已投票结束此问题。
function FakeEach(idx) {
if(idx >= 7500) return;
var $obj = $('select').eq(idx);
if($obj.length == 0) return;
...
$obj.trigger('change');
window.setTimeout(function() { FakeEach(idx++); }, 0);
}