Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:在另一个函数调用完成后继续函数 编辑:_Javascript_Jquery_Testing - Fatal编程技术网

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);
}