标签: jquery-deferred

如何使用jquery链接ajax调用

我需要在不锁定浏览器的情况下发出一系列N ajax请求,并希望使用jquery延迟对象来完成此任务.

下面是三个请求一个简单的例子,但我的程序可能需要超过100个排队(注意,这是不准确的使用情况下,实际的代码确实需要确保步骤执行下一之前成功(N-1)步):

$(document).ready(function(){

    var deferred = $.Deferred();

    var countries = ["US", "CA", "MX"];

    $.each(countries, function(index, country){

        deferred.pipe(getData(country));

    });

 });

function getData(country){

    var data = {
        "country": country  
    };


    console.log("Making request for [" + country + "]");

    return $.ajax({
        type: "POST",
        url: "ajax.jsp",
        data: data,
        dataType: "JSON",
        success: function(){
            console.log("Successful request for [" + country + "]");
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

这是写入控制台的内容(所有请求都是并行进行的,响应时间与每个国家/地区的数据大小成正比:

Making request for [US]
Making request for [CA]
Making request for [MX]
Successful request for [MX]
Successful request for …
Run Code Online (Sandbox Code Playgroud)

ajax jquery deferred jquery-deferred

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

如何在自定义函数中使用jQuery promise/deffered?

我有一个功能,通过navigator.geolocation以下方式获取位置:

var getLocation = function( callback ){

    navigator.geolocation.getCurrentPosition( callback || function( position ){

        // Stuff with geolocation

    });

};
Run Code Online (Sandbox Code Playgroud)

我想使它这样我就可以用链jQuerys'这个功能递延对象,但我仍然没有成功地把握递延的概念和使用方法.

我正在寻找类似于这个伪代码的东西:

getLocation().then(function(){
    drawMarkerOnMap();
});
Run Code Online (Sandbox Code Playgroud)

这种语法是否可以在不向后翻转并在代码中淹没的情况下实现?

javascript jquery jquery-deferred

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

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首先加载?我在很多网站上遇到这个问题,我到处都看到了.这是我目前正在进行的网站:

http://www.bridgecitymedical.com/wordpress/

谢谢!

文艺青年最爱的我如何可以推迟的JavaScript加载在我的网站上,这样别的,从而防止白"闪光"浏览器之前完成下载图像之前的背景图像加载.

javascript css jquery-deferred

30
推荐指数
3
解决办法
6万
查看次数

在jQuery 1.8中使用pipe()和then()文档与现实

更新:由于文档准确且最新,此问题现在已过时.

我已经探索了一下jQuery的递延/无极API和我对之间的差异非常困惑pipe()then()哲学和jQuery的文档.我发现从jQuery 1.8开始,pipe()只是then()的别名.

来自jQuery源码:

// Keep pipe for back-compat
promise.pipe = promise.then;
Run Code Online (Sandbox Code Playgroud)

然而,文档完全不同pipe(),then()因为它们被认为具有完全不同的用途.

说明then():

描述:添加在解析或拒绝Deferred对象时要调用的处理程序.

说明pipe():

描述:过滤和/或链接延迟的实用方法.

据我所知,从历史上看,它们的行为略有不同,但在管道文档或当时的文档中,它甚至没有说这两个函数现在完全相同.

所以,这是我的两部分问题:

  1. 为什么jQuery 1.8 之间的文档pipe()then()不同之处?
  2. 为什么then()返回一个新的延迟对象?这种行为完全没有记录(文档只是说它返回Deferred,而不是它是一个新的).我知道这样做有用(即实现所有pipe()的功能),但从哲学上讲,为什么会这样呢?鉴于then()(附加处理程序)的描述,这是不必要的.

更新

我甚至会说这些then()文档具有误导性和不准确性:

由于deferred.then 返回延迟对象,因此延迟对象的其他方法可以链接到此方法,包括其他.then()方法.

也许它只是模糊,但它意味着它返回你then()为链接调用的延迟对象,而实际上它返回一个全新的对象....

再次更新

似乎文档完全错误/过时了!所以这就解释了为什么文档没有提到它们是同一个东西.但是,我的第二个问题仍然存在.原因then()是简单地返回一个新的延迟,以便它pipe()可以变得等效吗?

javascript jquery jquery-deferred

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

如何判断对象是否为jQuery Promise/Deferred?

我有一个函数,只需一个参数.我需要能够判断这个参数是jQuery Promise还是Deferred对象.如果没有,那么该值可以是任何类型并且具有任何属性,因此仅仅因为promise方法的存在是不安全的.

这是一个我希望我的函数表现如何的例子:

function displayMessage(message) {
  if (message is a Promise or Deferred) {
    message.then(displayMessage);
  } else {
    alert(message);
  }
}
Run Code Online (Sandbox Code Playgroud)

注意promises的递归处理:如果使用另一个promise值解析promise而我们不显示它,我们等待它被解析.如果它返回另一个承诺,重复一遍.


这很重要,因为如果不是这样,我只能使用jQuery.when:

function displayMessage(message) {
  jQuery.when(message).then(function(messageString) {
    alert(messageString);
  });
}
Run Code Online (Sandbox Code Playgroud)

这将正确处理值的值和承诺......

displayMessage("hello");                            // alerts "hello"
displayMessage(jQuery.Deferred().resolve("hello")); // alerts "hello"
Run Code Online (Sandbox Code Playgroud)

......但是一旦我们接受了价值承诺的承诺,它就会崩溃:

displayMessage(jQuery.Deferred().resolve(
  jQuery.Deferred().resolve("hello")
));                                                 // alerts "[object Object]"
Run Code Online (Sandbox Code Playgroud)

jQuery.when能够判断一个值是否是承诺,所以显然它是可能的.我怎么检查?

javascript jquery jquery-deferred

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

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

如何使所有AJAX调用顺序?

我使用jQuery.而且我不希望在我的应用程序上进行并行AJAX调用,每个调用必须在开始之前等待之前的调用.怎么实现呢?有帮助吗?

更新如果有XMLHttpRequest或jQuery.post的任何同步版本,我想知道.但顺序!=同步,我想要一个异步和顺序的解决方案.

parallel-processing ajax jquery sequential jquery-deferred

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

jQuery Deferred,$ .when()和fail()回调参数

$.when()当其中一个延迟操作不成功时使用时,我得到一个意外的结果.

拿这个JavaScript,创建2个延迟.第一个成功,第二个失败.

var f1 = function() {
    return $.Deferred(function(dfd) {
        dfd.resolve('123 from f1');
    }).promise();
};

var f2 = function() {
    return $.Deferred(function(dfd) {
        dfd.reject('456 from f2');
    }).promise();
};

$.when(f1(), f2())
    .then(function(f1Val, f2Val) {
        alert('success! f1, f2: ' + JSON.stringify([f1Val, f2Val]));
    })
    .fail(function(f1Val, f2Val) {
        alert('fail!    f1, f2: ' + JSON.stringify([f1Val, f2Val]));
    });
Run Code Online (Sandbox Code Playgroud)

自己运行:http://jsfiddle.net/r2d3j/2/

我明白了 fail! f1, f2: ["456 from f2", null]

问题是在.fail()回调中,随f2()拒绝传递的值被路由到第一个参数,我希望在那里f1Value.这意味着我真的没有办法知道哪个延迟对象实际发布了这个reject(),而且我也不知道故障数据实际属于哪个操作.

我原以为这.fail()会得到参数,null, '456 from …

javascript jquery jquery-deferred

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

jQuery Deferred:拒绝完成过滤器中的承诺

Fyi,我刚刚开始学习jQuery的承诺,所以我在这里可能有点困惑.

无论如何,我有一个AJAX请求,我想根据响应的内容在完成过滤器中拒绝:

return doAJAXRequest().then(function (data) {
    if (data.responseText == "YES") {
        return doOtherAJAXRequest();
    } else {
        this.reject(data);
    }
});
Run Code Online (Sandbox Code Playgroud)

这不像我预期的那样有效:

Uncaught TypeError: Object #<Object> has no method 'reject'
Run Code Online (Sandbox Code Playgroud)

我如何根据其响应使此承诺失败?那可能吗?或者我只是对这里需要做什么感到困惑?

jquery jquery-deferred

23
推荐指数
1
解决办法
9807
查看次数