标签: jquery-deferred

使用jQuery延迟 - when()使用getJSON()回调

我正在尝试理解whenjQuery中的函数和延迟对象.

$.when($.getJSON('/echo/json', function () {
    console.log('sucess');
}, function () {
    console.log('error');
})).then(console.log('get JSON ready!'));
Run Code Online (Sandbox Code Playgroud)

此示例返回:

get JSON ready!
sucess
Run Code Online (Sandbox Code Playgroud)

...但我希望首先实现成功回调:

sucess
get JSON ready!
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

http://jsfiddle.net/lukaszr/rBFmL/

javascript jquery deferred jquery-deferred

7
推荐指数
1
解决办法
7788
查看次数

jQuery推迟不工作

我正在尝试代码

function search(query) {
    var dfr = $.Deferred();
    $.ajax({
        url: "http://search.twitter.com/search.json",
        data: {
            q: query
        },
        dataType: 'jsonp',
        success: dfr.resolve
    });
    return dfr.promise();
}

Test = {
    start: function(){
        alert("Starting");
    }
};

function gotresults(data) {
    alert(data.max_id);
}

function showDiv() {
    $('<div />').html("Results received").appendTo('body');
}

$.when(search('ashishnjain'))
    .then(gotresults)
    .then(showDiv);
Run Code Online (Sandbox Code Playgroud)

这按预期工作.但是当我把它写成:

Test.start()
    .then(search('ashishnjain'))
    .then(gotresults)
    .then(showDiv);
Run Code Online (Sandbox Code Playgroud)

它只是警告"开始"并终止.可以在http://jsfiddle.net/XQFyq/2/找到一个工作示例.我究竟做错了什么?

javascript ajax jquery jquery-deferred

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

"解决"延迟对象

简而言之,有没有办法"解决"延迟对象?

例如:我们有一个需要定期更新的数据列表,或者触发事件时的数据列表.使用.ajax()创建的延迟对象并传递它的promise来收集回调会很棒.然后在我们想要的时候"激活"ajax请求并让所有回调做出反应.那可能吗?

干杯

javascript jquery jquery-deferred

6
推荐指数
1
解决办法
951
查看次数

如何在jquery 1.5中管理ajax请求的队列?

我一直在jquery 1.5中测试新的延迟AJAX函数,并且对它们的简单性和强大功能印象深刻.我有一个更大的问题与排队这些请求的最佳方式有关.

我有两种情况:串行和并行,如果你愿意的话.我想避免同步/异步术语,因为我确实希望所有这些都是异步请求,因此用户可以在等待队列处理时执行其他操作.然后我想在队列完成处理时调用单个函数.

在具有两个请求的"串行模式"中,我希望它们按如下方式处理:

RequestA - > ResponseA - > RequestB - > ResponseB - > EndOfQueue

在具有两个请求的"并行模式"中,我想要这个结果:

RequestA - > RequestB(ResponseA,响应B在准备就绪时处理) - > EndOfQueue

在任何一种情况下,如果任何请求失败,我希望队列停止并将控制传递给失败函数.

我有要求指定动态队列长度所以我不认为我能够将一堆.then()或.when()延迟串起来,因为我不知道它是一百件还是一百件.我正在通过供应商的API在服务器上执行业务逻辑,因此服务器端批处理将很困难,因为我无法控制该代码.

我已经构建了执行"并行"情况的测试用例,并在所有成功完成后调用了when()函数,但这些测试在队列长度上不是动态的,并且不能移植到串行模型.

我可以看到如何创建一个自定义队列对象来处理这个问题,但似乎所有的部分都已经在jquery(?)中为我编写了.我看过了,但还没有找到以这种方式涵盖顺序请求的示例.

有关如何使用jquery队列/延迟功能处理此问题的任何想法?

javascript queue jquery jquery-1.5 jquery-deferred

6
推荐指数
1
解决办法
3818
查看次数

jQuery延迟 - 我需要管道或链来实现这种模式吗?

我正在尝试实现下面的场景,使用JQuery延迟,没有太多运气.

您将使用延迟api的哪些部分,以及如何构建调用以实现以下目标:

第一个ajax callA到serviceA检索ID列表

等到这个电话回来

然后n ajax调用serviceB,每次调用使用callA返回的列表中的Id

等到所有serviceB调用都返回

然后是对serviceC的最终ajax调用

javascript ajax jquery jquery-deferred

6
推荐指数
1
解决办法
2488
查看次数

延迟jquery的计时问题

这个问题是精心提炼的非异步函数版本,作为jQuery Deferred执行.

我们有2个jsfiddles:

  1. http://jsfiddle.net/XSDVX/1/ - 尽管调用了notify()函数,但不会触发progress事件.

  2. http://jsfiddle.net/UXSbw/1/ - 这里按预期触发进度事件.

唯一的区别是一行代码:

setTimeout(dfd.resolve,1);
Run Code Online (Sandbox Code Playgroud)

dfd.resolve();
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. 当我们延迟解决时,如何捕获在此回调返回之前调用的.notify?想一想..then获取从它的第一个参数返回的延迟对象,并从中创建一个新的延迟对象,绑定到它完成的进度和失败事件.如果在返回deferred之前调用了notify,那么即使使用setTimeout,如何捕获它呢?(感谢/sf/users/28045811/询问此问题)

  2. 我可以摆脱setTimeout()并仍然有进展回调被解雇?

javascript jquery race-condition deferred jquery-deferred

6
推荐指数
1
解决办法
661
查看次数

将参数传递给$ .then函数

我有以下内容:

$(".remove-item").click(function(e) {
    e.preventDefault();

    var url = $(this).attr('href');
    var id = $(this).data("id");
    $.when(removeItem(url))
      .then(removeItemResponse(id));
});

var removeItemResponse = function(data, id) {
   console.log(data);
   console.log(id);
};

var removeItem = function(url) {
  return $.post(url);
};
Run Code Online (Sandbox Code Playgroud)

以上是行不通的,因为在处理ajax请求之后我在日志中什么也得不到,我知道它与我如何处理removeItemResponse中的参数有关.我需要使用来自ajax帖子的返回数据,但也传递我在click函数中检索到的id.

jquery jquery-deferred

6
推荐指数
1
解决办法
7194
查看次数

使jQuery Deferred/Promises和AngularJS $ q Deferred/Promises兼容

我有一些旧的JavaScript库,它们使用jQuery promises作为函数调用的返回对象.我现在正在使用AngularJS,它使用$ q服务(受Q库启发).有没有人有一些通用的JavaScript代码来使这两个不同的promise实现兼容,所以jQuery promises可以像$ q promises一样使用?或类似的东西?

jquery-deferred angularjs q

6
推荐指数
1
解决办法
3425
查看次数

什么样的设计模式是jQuery的Deferreds和Promises?

似乎jQuery的Deferred实际上可以处理Deferred对象和Promise对象可以执行的所有方法,但它只向用户返回一个Promise对象,以便给出方法的子集,以便用户无法解析或拒绝 - 对于用户不应该做的事情.

因此,Deferred实际上非常清楚.可能令人困惑的是另一个类Promise,它使事情看起来更复杂,因为现在这个模式有两个类,它可能看起来令人困惑.

我想知道

  1. 以上是准确的吗?
  2. 它是一个自己的设计模式,还是实际上与其他经典设计模式类似,实际上这些"许多方法"是可能的(延迟),但"仅限制它的一个子集给予类的用户"(承诺)那种设计模式?

jquery design-patterns promise jquery-deferred

6
推荐指数
2
解决办法
529
查看次数

Q.defer()和Promise()之间的区别

我试图理解为什么以下代码与Q.defer()和Promise()的行为不同

案例1:当我使用Q.defer()时

getDocument(id)
.then(function (response) {
   console.log('in first then')
   return 'from two';
}).then(function (response) {
   console.log(response)
});

var getDocument=function(){
  var b = Q.defer();
    b.resolve('from getDocument'); // here will do some async operation..this is just an example
  return b.promise;
}
Run Code Online (Sandbox Code Playgroud)

输出:

in first then
undefined
Run Code Online (Sandbox Code Playgroud)

案例2:使用Promise()

getDocument(id)
.then(function (response) {
   console.log('in first then')
   return 'from two';
}).then(function (response) {
   console.log(response)
});

var getDocument=function(){
  return Promise.resolve('from getDocument');
}
Run Code Online (Sandbox Code Playgroud)

输出:

in first then        
from two
Run Code Online (Sandbox Code Playgroud)

  1. 为什么输出会有差异?
  2. 我知道Q.defer是一个反模式,但那么如何选择何时使用什么?

javascript node.js promise jquery-deferred q

6
推荐指数
1
解决办法
3396
查看次数