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
}