相关疑难解决方法(0)

将Deferred数组传递给$ .when()

这是一个人为的例子:http://jsfiddle.net/adamjford/YNGcm/20/

HTML:

<a href="#">Click me!</a>
<div></div>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

function getSomeDeferredStuff() {
    var deferreds = [];

    var i = 1;
    for (i = 1; i <= 10; i++) {
        var count = i;

        deferreds.push(
        $.post('/echo/html/', {
            html: "<p>Task #" + count + " complete.",
            delay: count
        }).success(function(data) {
            $("div").append(data);
        }));
    }

    return deferreds;
}

$(function() {
    $("a").click(function() {
        var deferreds = getSomeDeferredStuff();

        $.when(deferreds).done(function() {
            $("div").append("<p>All done!</p>");
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

我想要"全部完成!" 在所有延迟任务完成后$.when()出现,但似乎不知道如何处理Deferred对象数组."全部完成!" 首先发生的是因为数组不是Deferred对象,所以jQuery继续并假设它刚刚完成.

我知道可以将对象传递给函数,$.when(deferred1, deferred2, ..., deferredX) …

javascript jquery argument-passing jquery-deferred .when

439
推荐指数
6
解决办法
11万
查看次数

多个ajax调用的jQuery回调

我想在点击事件中进行三次ajax调用.每个ajax调用都执行不同的操作,并返回最终回调所需的数据.呼叫本身并不依赖于彼此,它们都可以同时进行,但是当所有三个呼叫完成时,我希望最终回调.

$('#button').click(function() {
    fun1();
    fun2();
    fun3();
//now do something else when the requests have done their 'success' callbacks.
});

var fun1= (function() {
    $.ajax({/*code*/});
});
var fun2 = (function() {
    $.ajax({/*code*/});
});
var fun3 = (function() {
    $.ajax({/*code*/});
});
Run Code Online (Sandbox Code Playgroud)

ajax jquery callback

126
推荐指数
4
解决办法
15万
查看次数

如何设置jquery select2的选定值?

这属于select2版本4之前的代码

我有一个简单的代码,select2从ajax获取数据

$("#programid").select2({
  placeholder: "Select a Program",
  allowClear: true,
  minimumInputLength: 3,
  ajax: {
    url: "ajax.php",
    dataType: 'json',
    quietMillis: 200,
    data: function (term, page) {
      return {
        term: term, //search term
        flag: 'selectprogram',
        page: page // page number
      };
    },
    results: function (data) {
      return {results: data};
    }
  },
  dropdownCssClass: "bigdrop",
  escapeMarkup: function (m) { return m; }
});
Run Code Online (Sandbox Code Playgroud)

此代码正常工作,但是,我需要在其上设置一个值,就像在编辑模式下一样.当用户第一次选择一个值时,它将被保存,当他需要编辑该值时,它必须出现在同一个选择菜单(select2)中,以选择之前选择的值,但我找不到方法.

更新:

HTML代码:

<input type="hidden" name="programid" id="programid" class="width-500 validate[required]">
Run Code Online (Sandbox Code Playgroud)

Select2编程访问不适用于此.

javascript php ajax jquery jquery-select2

86
推荐指数
13
解决办法
28万
查看次数

如何知道所有ajax调用何时完成

我有一个包含行的表格样式页面.每行都有一个复选框.我可以选择所有/多个复选框,然后单击"提交",每个行的Jquery ajax调用是什么.

基本上我有一个每行的表单,我迭代所有检查的行,并提交该表单进行jquery ajax调用.

所以我有一个按钮:

       $("input:checked").parent("form").submit();
Run Code Online (Sandbox Code Playgroud)

然后每一行都有:

            <form name="MyForm<%=i%>" action="javascript:processRow(<%=i%>)" method="post" style="margin:0px;">
                <input type="checkbox" name="X" value="XChecked"/>
                <input type="hidden" id="XNumber<%=i%>" name="X<%=i%>" value="<%=XNumber%>"/>
                <input type="hidden" id="XId<%=i%>" name="XId<%=i%>" value="<%=XNumber%>"/>
                <input type="hidden" id="XAmt<%=i%>" name="XAmt<%=i%>" value="<%=XAmount%>"/>
                <input type="hidden" name="X" value="rXChecked"/>
            </form>
Run Code Online (Sandbox Code Playgroud)

此表单提交到processRow:

   function processRow(rowNum)
   {
        var Amount = $('#XAmt'+rowNum).val();
        var XId = $('#XId'+rowNum).val();
        var XNum = $('#OrderNumber'+rowNum).val();
        var queryString = "xAmt=" + "1.00" + "&xNumber=" + OrdNum + "&xId=" + xId;


        $('#coda_'+rowNum).removeClass("loader");
        $('#coda_'+rowNum).addClass("loading");


        $.ajax({
          url: "x.asp",
          cache: false,
          type:  "POST",
          data:  queryString,
          success: function(html){
            $('#result_'+rowNum).empty().append(html); …
Run Code Online (Sandbox Code Playgroud)

ajax jquery

74
推荐指数
3
解决办法
8万
查看次数

对ajax请求进行排序

我发现有时我需要迭代一些集合并为每个元素进行ajax调用.我希望在转移到下一个元素之前返回每个调用,这样我就不会向服务器发送请求 - 这通常会导致其他问题.我不想将异步设置为false并冻结浏览器.

通常这涉及设置某种迭代器上下文,我逐步通过每个成功回调.我认为必须有一个更简洁的方式?

有没有人有一个聪明的设计模式,如何通过一个集合为每个项目制作ajax调用整齐地工作?

javascript queue ajax jquery design-patterns

63
推荐指数
2
解决办法
3万
查看次数

jQuery Deferred - 等待多个AJAX请求完成

我有一个三层深度的延迟ajax调用链,理想情况下,当最深层完成时,它们会一直向前推进(使我成为Inception ..."我们需要更深入!").

问题是我一次发送了许多ajax请求(可能是数百个),需要推迟直到所有这些请求完成.我不能依赖最后一次完成.

function updateAllNotes() {
    return $.Deferred(function(dfd_uan) {
        getcount = 0;
        getreturn = 0;
        for (i = 0; i <= index.data.length - 1; i++) {
            getcount++;
            $.when(getNote(index.data[i].key)).done(function() {
                // getNote is another deferred
                getreturn++
            });
        };
        // need help here
        // when getreturn == getcount, dfd_uan.resolve()
    }).promise();
};
Run Code Online (Sandbox Code Playgroud)

jquery jquery-deferred

56
推荐指数
3
解决办法
5万
查看次数

在继续之前等待多个异步调用完成

所以,我有一个加载的页面,并通过jquery.get发出几个请求,用它们的值填充下拉列表.

$(function() {
    LoadCategories($('#Category'));
    LoadPositions($('#Position'));
    LoadDepartments($('#Department'));

    LoadContact();
};
Run Code Online (Sandbox Code Playgroud)

然后调用LoadContact(); 这是另一个调用,当它返回时,它会填充表单上的所有字段.问题是通常,下拉列表并非全部填充,因此,它无法将它们设置为正确的值.

我需要做的是,只要其他方法完成并且回调完成执行,LoadContact就会以某种方式执行.

但是,我不想在下拉填充回调的末尾放置一堆标志,然后检查,并且在调用LoadContact()之前必须进行递归的setTimeout调用检查;

jQuery中有什么东西可以让我说,"当所有这些都完成时执行它."?

更多信息 我正在考虑这些问题

$().executeAfter(
    function () {   // When these are done
        LoadCategories($('#Category'));
        LoadPositions($('#Position'));
        LoadDepartments($('#Department'));
    },
    LoadContact // Do this
);
Run Code Online (Sandbox Code Playgroud)

...它需要跟踪在执行方法期间发生的ajax调用,并且当它们全部完成时,调用LoadContact;

如果我知道如何拦截在该函数中创建的ajax,我可能会编写一个jQuery扩展来执行此操作.

我的解决方案

;(function($) {
    $.fn.executeAfter = function(methods, callback) {

        var stack = [];

        var trackAjaxSend = function(event, XMLHttpRequest, ajaxOptions) {
            var url = ajaxOptions.url;

            stack.push(url);
        }

        var trackAjaxComplete = function(event, XMLHttpRequest, ajaxOptions) {
            var url = ajaxOptions.url;

            var index = jQuery.inArray(url, stack);

            if (index >= 0) …
Run Code Online (Sandbox Code Playgroud)

javascript jquery asynchronous callback

55
推荐指数
3
解决办法
4万
查看次数

jQuery.当使用可变数量的参数进行故障排除时

我在使用jQuery.when()在调用另一个函数之前等待多个ajax请求完成时遇到了问题.

每个ajax请求都会获得JSON数据,看起来像这样:

   function loadData(arg){
        var ajaxCall = $.ajax(
            URL // depends on arg
        )
       .error( .... );
       return ajaxCall;
   }
Run Code Online (Sandbox Code Playgroud)

调用请求时,返回值(ajaxCall)将添加到名为ajaxRequests的列表中.

    ajaxRequests = [];
    ajaxREquests.push(loadData(arg))
Run Code Online (Sandbox Code Playgroud)

当所有请求都已完成后,我正在尝试将ajaxRequests传递给$ .when,以便等待所有请求完成.

        var defer = $.when.apply($, ajaxRequests);
        defer.done(function(args){
            for (var i=0; i<args.length; i++){
                inst.loadData($.parseJSON(args[i].responseText));
            }
            inst.draw();
        });
Run Code Online (Sandbox Code Playgroud)

inst是一个基于JSON数据加载和绘制图形的对象.

问题是它似乎并没有真正等待请求完成 - args [i]是一个对象,但是当代码运行时,responseText是未定义的.如果我保存args [i]并稍后从控制台访问它,它可以工作.

我怀疑这个问题与使用.when和任意数量的参数有关,因为我在网上看到的所有例子都给它一个预定义的参数列表.

我不确定使用apply是否是正确的想法,但无论哪种方式它都无法正常工作并且行为不正常(依赖于浏​​览器).

任何帮助将不胜感激.

如果需要更多信息,请告诉我.
我正在使用jQuery 1.5

jquery jquery-deferred

31
推荐指数
2
解决办法
1万
查看次数

JavaScript似乎不等待返回值

我一直在努力解决这个问题.我是Javascript的新手,并且一直认为我写的代码已经异步运行了.这是一个通用的例子:

我在函数a中运行了一些代码.函数A然后调用函数B,函数B需要将变量返回给A,因此A可以在以后的操作中使用它.看来,当A调用B时,它仍然继续运行自己的代码,而不是等待其返回值被阻塞,并且B不够快,使得A最终到达需要使用返回的点值,我得到一个未定义的变量类型错误.

我解决这个问题的方法是函数A调用函数B然后调用一个函数C,它将执行A将使用返回值执行的后续操作....我有点通过调用序列化我的代码而不是返回......虽然很麻烦......

以下是在实际代码中发生的示例:

function initialize() {
    //Geocode Address to obtin Lat and Long coordinates for the starting point of our map
    geocoder = new google.maps.Geocoder();
    var results = geocode(geocoder);
    makeMap(results[0].geometry.location.lat(), results[0].geometry.location.lng());

}

function geocode(geocoder) {
    //do geocoding here...

    var address = "3630 University Street, Montreal, QC, Canada";
    geocoder.geocode({ 'address': address }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
           return results;
            }
         else {
            alert("Geocode was not successful for the following reason: " + status);
        } …
Run Code Online (Sandbox Code Playgroud)

javascript asynchronous callback asynccallback

26
推荐指数
2
解决办法
3万
查看次数

所有ajax .load()请求完成后执行函数

我有一个有标签集的页面.每个选项卡都由jQuery .load()函数加载.

我想显示一个加载动画,当所有的ajax请求都完成时,它会消失.但是,document.ready()只给了我有限的成功.

在执行代码隐藏加载动画之前,如何确保完成所有ajax请求?

ajax jquery

19
推荐指数
3
解决办法
4万
查看次数