Javascript $.get()提交页面前遇到的问题

Javascript $.get()提交页面前遇到的问题,javascript,jquery,Javascript,Jquery,想象一个购物篮,里面有一些“商品”。 我有一个元素列表,每个元素都有一个包含数字的字段——金额 从概念上讲,这就是我想要的:当用户按下一个按钮时,我通过每个元素循环选择金额。然后我使用$.Get()调用服务器,使用商品id+数量来检查商店是否有足够的特定商品。服务器回复True或False。 此答复临时存储在html字段中。 现在,在循环完成后,我检查是否有任何商品的错误回复。 如果是,我突出显示“false”项。否则我就投降了 好的,问题是我的代码无法通过$.get()回调函数继续执行,因此在

想象一个购物篮,里面有一些“商品”。 我有一个
  • 元素列表,每个元素都有一个包含数字的字段——金额

    从概念上讲,这就是我想要的:当用户按下一个按钮时,我通过每个
  • 元素循环选择金额。然后我使用$.Get()调用服务器,使用商品id+数量来检查商店是否有足够的特定商品。服务器回复True或False。 此答复临时存储在html字段中。 现在,在循环完成后,我检查是否有任何商品的错误回复。 如果是,我突出显示“false”项。否则我就投降了

    好的,问题是我的代码无法通过$.get()回调函数继续执行,因此在$.get()实际从服务器接收结果之前,将对是否返回了false的最终检查进行评估。 无论如何,这就是我认为正在发生的事情

    现在让我们看一些代码:

    var tmp = new Array();
    var id = '';
    var c = '';
    var n = 0;
    var z=0;
    $('#basket').find('li.list').each(function() {
    c = $(this).find('input.fldamount').val();  // this is the amount field
    id = $(this).attr('id');  // this is the id no of the item
    $.get('./(RPC)?OpenAgent&cmd=movewhcheckamount&unid='+id+'&count='+c, function(data) {
        $('#RPCResult').val(data);  // i store the returned value in a html field
        if ( $('#RPCResult').val() == "true" ) {
          tmp.push( id+'|'+c );  // if true is returned, i push the id & amount to an array
        } else {
          $(this).addClass('red');  // else i tag the item
          n=n+1;  // and then increment a counter
        }
    } );  // $('#basket')
    
    var t = window.setTimeout( function() {
      if (tmp.length > 0 && n == 0)  {  // if i got items in the array AND my false counter is zero
        $('#SelectedArtikler').val( tmp.join(";") );  // then i store the array as text in a field
        document._FlyttArtikel.submit();  // and submit
      } else if (n > 0) {
        // show a popup
        alert("You're trying to move more items than exists...");
      } else {
        alert("ops, nothing to move...");  // should never end up here...
      }
    }, 1000);
    window.clearTimeout(t);
    
    正如您所看到的,我尝试使用setTimeout来反作用通过回调函数运行的代码,因此我基本上会等待一秒钟,以便给服务器响应的时间。 我确实在setTimeout周围有另一个循环,只要我的#RPCResult字段为空,它就会继续,但这导致了一个无限循环

    我有一个“RPCResult”字段可见,这样我就可以看到发生了什么,我看到的是弹出窗口“您正在尝试移动更多项目…”被显示出来,在我按下该弹出窗口上的ok后,右键,然后“RPCResult”字段得到的结果为真/假

    我现在知道一些代码可以优化,但我现在感兴趣的是以适当的方式获得$.get()结果


    提前感谢;-)

    您必须将所有“$.get()”调用完成后将要运行的代码放入回调例程中。这是唯一一个可以确保您实际获得服务器响应的地方。保留一个计数器,记录返回的呼叫数,当计数器递增到等于项目总数时,您就知道所有响应都可用

    因此:

    提供项目数并初始化计数器。在传递给“$.get()”的回调函数中,您可以执行如下操作:

      if (++completed === basketSize) {
        // code currently in the "setTimeout()" callback
      }
    
    您的代码似乎已经在做一些这方面的工作(递增的“n”变量)

    现在,也就是说,我还要注意,为每个“项目”执行单独的HTTP事务是非常疯狂的。您应该将它们打包成一个HTTP请求,返回一个答案列表


    此外,在“RPCresult”字段中存储对“$.get()”的响应实际上毫无意义;只需检查“data”的值,因为无论如何都不会再看到“RPCresult”了。

    1我不想给您加线程,但为什么不在method.setTimeout()中将函数体放入一个额外的函数中呢。代码显然更易于阅读。您是对的,但这是一个仍在开发中的粗略代码;-):-),但是,如果您编写了一个干净的代码,那么您可以为自己做一件事。防止错误。啊,说得对!我回家后会试试这个。。。关于HTTP事务,严格来说你是对的。但我不希望篮子里最多有10件物品。最后,创建RPCResult字段只是为了在开发时使响应可见;-)谢谢你花时间在这件事上,我稍后会带着我的结果回来的!事实上,HTTP事务占用的大部分时间都是由延迟引起的,因此执行10个单独的请求很可能需要的时间几乎是只执行一个请求的10倍。
      if (++completed === basketSize) {
        // code currently in the "setTimeout()" callback
      }