我需要在不锁定浏览器的情况下发出一系列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) 我有一个功能,通过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)
这种语法是否可以在不向后翻转并在代码中淹没的情况下实现?
我在使用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
问题是,在网络上的大多数网站上都有背景图片.他们需要时间来加载.通常,如果图像被优化并且足够小,则不会成为问题.但是,在我的一些网站上,javascript文件会在页面上的任何其他内容之前加载,即使它们位于页脚中!这会在加载背景图像之前创建白色"闪光".为什么我的javascript首先加载?我在很多网站上遇到这个问题,我到处都看到了.这是我目前正在进行的网站:
http://www.bridgecitymedical.com/wordpress/
谢谢!
文艺青年最爱的我如何可以推迟的JavaScript加载在我的网站上,这样别的,从而防止白"闪光"浏览器之前完成下载图像之前的背景图像加载.
我已经探索了一下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():
描述:过滤和/或链接延迟的实用方法.
据我所知,从历史上看,它们的行为略有不同,但在管道文档或当时的文档中,它甚至没有说这两个函数现在完全相同.
所以,这是我的两部分问题:
pipe()和then()不同之处?then()返回一个新的延迟对象?这种行为完全没有记录(文档只是说它返回Deferred,而不是它是一个新的).我知道这样做有用(即实现所有pipe()的功能),但从哲学上讲,为什么会这样呢?鉴于then()(附加处理程序)的描述,这是不必要的.更新
我甚至会说这些then()文档具有误导性和不准确性:
由于deferred.then 返回延迟对象,因此延迟对象的其他方法可以链接到此方法,包括其他.then()方法.
也许它只是模糊,但它意味着它返回你then()为链接调用的延迟对象,而实际上它返回一个全新的对象....
再次更新
似乎文档完全错误/过时了!所以这就解释了为什么文档没有提到它们是同一个东西.但是,我的第二个问题仍然存在.原因then()是简单地返回一个新的延迟,以便它pipe()可以变得等效吗?
我有一个函数,只需一个参数.我需要能够判断这个参数是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能够判断一个值是否是承诺,所以显然它是可能的.我怎么检查?
我使用jQuery.而且我不希望在我的应用程序上进行并行AJAX调用,每个调用必须在开始之前等待之前的调用.怎么实现呢?有帮助吗?
更新如果有XMLHttpRequest或jQuery.post的任何同步版本,我想知道.但顺序!=同步,我想要一个异步和顺序的解决方案.
$.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 …
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)
我如何根据其响应使此承诺失败?那可能吗?或者我只是对这里需要做什么感到困惑?