我正在尝试理解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)
我怎样才能做到这一点?
我正在尝试代码
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/找到一个工作示例.我究竟做错了什么?
简而言之,有没有办法"解决"延迟对象?
例如:我们有一个需要定期更新的数据列表,或者触发事件时的数据列表.使用.ajax()创建的延迟对象并传递它的promise来收集回调会很棒.然后在我们想要的时候"激活"ajax请求并让所有回调做出反应.那可能吗?
干杯
我一直在jquery 1.5中测试新的延迟AJAX函数,并且对它们的简单性和强大功能印象深刻.我有一个更大的问题与排队这些请求的最佳方式有关.
我有两种情况:串行和并行,如果你愿意的话.我想避免同步/异步术语,因为我确实希望所有这些都是异步请求,因此用户可以在等待队列处理时执行其他操作.然后我想在队列完成处理时调用单个函数.
在具有两个请求的"串行模式"中,我希望它们按如下方式处理:
RequestA - > ResponseA - > RequestB - > ResponseB - > EndOfQueue
在具有两个请求的"并行模式"中,我想要这个结果:
RequestA - > RequestB(ResponseA,响应B在准备就绪时处理) - > EndOfQueue
在任何一种情况下,如果任何请求失败,我希望队列停止并将控制传递给失败函数.
我有要求指定动态队列长度所以我不认为我能够将一堆.then()或.when()延迟串起来,因为我不知道它是一百件还是一百件.我正在通过供应商的API在服务器上执行业务逻辑,因此服务器端批处理将很困难,因为我无法控制该代码.
我已经构建了执行"并行"情况的测试用例,并在所有成功完成后调用了when()函数,但这些测试在队列长度上不是动态的,并且不能移植到串行模型.
我可以看到如何创建一个自定义队列对象来处理这个问题,但似乎所有的部分都已经在jquery(?)中为我编写了.我看过了,但还没有找到以这种方式涵盖顺序请求的示例.
有关如何使用jquery队列/延迟功能处理此问题的任何想法?
我正在尝试实现下面的场景,使用JQuery延迟,没有太多运气.
您将使用延迟api的哪些部分,以及如何构建调用以实现以下目标:
第一个ajax callA到serviceA检索ID列表
等到这个电话回来
然后n ajax调用serviceB,每次调用使用callA返回的列表中的Id
等到所有serviceB调用都返回
然后是对serviceC的最终ajax调用
这个问题是精心提炼的非异步函数版本,作为jQuery Deferred执行.
我们有2个jsfiddles:
http://jsfiddle.net/XSDVX/1/ - 尽管调用了notify()函数,但不会触发progress事件.
http://jsfiddle.net/UXSbw/1/ - 这里按预期触发进度事件.
唯一的区别是一行代码:
setTimeout(dfd.resolve,1);
Run Code Online (Sandbox Code Playgroud)
与
dfd.resolve();
Run Code Online (Sandbox Code Playgroud)
问题是:
当我们延迟解决时,如何捕获在此回调返回之前调用的.notify?想一想..then获取从它的第一个参数返回的延迟对象,并从中创建一个新的延迟对象,绑定到它完成的进度和失败事件.如果在返回deferred之前调用了notify,那么即使使用setTimeout,如何捕获它呢?(感谢/sf/users/28045811/询问此问题)
我可以摆脱setTimeout()并仍然有进展回调被解雇?
我有以下内容:
$(".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.
我有一些旧的JavaScript库,它们使用jQuery promises作为函数调用的返回对象.我现在正在使用AngularJS,它使用$ q服务(受Q库启发).有没有人有一些通用的JavaScript代码来使这两个不同的promise实现兼容,所以jQuery promises可以像$ q promises一样使用?或类似的东西?
似乎jQuery的Deferred实际上可以处理Deferred对象和Promise对象可以执行的所有方法,但它只向用户返回一个Promise对象,以便给出方法的子集,以便用户无法解析或拒绝 - 对于用户不应该做的事情.
因此,Deferred实际上非常清楚.可能令人困惑的是另一个类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)
题
jquery-deferred ×10
jquery ×8
javascript ×7
ajax ×2
deferred ×2
promise ×2
q ×2
angularjs ×1
jquery-1.5 ×1
node.js ×1
queue ×1