我有一个页面,使用被称为100次的jQuery .ajax(async:true),问题是,当它们全部被加载时,我需要系统在继续之前等待所有100个调用返回.我该怎么做?
提前致谢!:)
更新:
这些调用是在for()循环中进行的(其中有100个:))
鉴于这些功能:
function func1() {
var dfd = $.Deferred();
setTimeout(function() {
dfd.resolve('Password');
}, 1000);
return dfd.promise();
}
function func2(message) {
var dfd = $.Deferred();
setTimeout(function() {
if (message == 'Password') {
dfd.resolve('Hello World');
}
}, 1000);
return dfd.promise();
}
Run Code Online (Sandbox Code Playgroud)
我想找到一个更好的方法来做到以下几点.注意这是使用jQuery 1.8.x.
var promise = func1();
promise.done(function(message1) {
var promise2 = func2(message1);
promise2.done(function(message2) {
alert(message2);
});
});
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我认为使用jQuery #pipe或#then会起作用,但我无法弄明白.这是一个小提琴:http://jsfiddle.net/Z7prn/
我用:
var jqXHR = $.ajax(settings);
jqXHR.success(function(result){});
jqXHR.error(function(result){});
jqXHR.complete(function(result){});
Run Code Online (Sandbox Code Playgroud)
但是版本1.5添加了延迟对象.
问:一般来说,你什么时候使用成功,错误和完整的方法与新的延迟,完成和失败的热度?
我仍然试图绕过我的脑袋deferred而不是,所以考虑到这一点,我有一个关于如何做以下事情的问题.
我的团队和我有3个单独的.load()方法,每个方法都抓住一个特定的模板并将其附加到同一个容器中.每个负载都会花费不同的时间,因此当内容加载时,它会以"阶梯式"方式加载(1,然后是2,然后是3).我想利用deferred物体并等到它们全部完成,然后同时附加它们以移除"阶梯"动作.
$('<div>').load(baseInfoTemplate, function () {
var baseData = {
// build some object
};
$.tmpl(this, baseData).appendTo($generalContainer);
});
Run Code Online (Sandbox Code Playgroud)
所有三个电话都与上面的电话类似.
我怎样才能做到这一点?
我正在编写一个充斥着异步任务的解析器.我使用JQuery promises来控制和排序异步任务.这是构造函数的伪代码版本:
/**
* @constructor
*/
function Parser(json)
{
return $.when(
this.delete().then(this.insert(json)),
this.doSomething(),
this.doSomethingElse().then(this.update(json))
)
};
Run Code Online (Sandbox Code Playgroud)
这是一个示例函数的样子:
Parser.prototype.doSomething = function()
{
var dfd = $.Deferred();
exampleTask(dfd.reject, dfd.resolve);
return dfd.promise();
};
Run Code Online (Sandbox Code Playgroud)
来自JQuery文档:
在将多个Deferred对象传递给jQuery.when的情况下,该方法从新的"master"Deferred对象返回Promise,该对象跟踪已传递的所有Deferred的聚合状态
如何使用.progress()通知任何关心Parser整体进度的人?例如
var parser = new Parser(json);
parser.progress(function(prog){console.log(prog});
Run Code Online (Sandbox Code Playgroud)
这是我想要做的事情的小提琴:http: //jsfiddle.net/ashanova/RjULA/2/
我正在创建一个ajax实用程序,用于连接我的服务器方法.我想从jQuery.ajax()调用返回的对象中利用jQuery 1.5+延迟方法.情况如下.
serverside方法始终返回JSON对象:
{ success: true|false, data: ... }
客户端实用程序启动这样的ajax调用
var jqxhr = $.ajax({ ... });
问题领域:
jqxhr.success(function(data, textStatus, xhr) {
if(!data || !data.success) {
???? // abort processing, trigger error
}
});
return jqxhr; // return to caller so he can attach his own handlers
Run Code Online (Sandbox Code Playgroud)所以问题是如何取消所有调用者的调用附加成功回调触发他的错误处理程序在提到的地方?????
文档说延迟函数调用列表是FIFO,所以我的成功处理程序绝对是第一个.
最近在开发Backbone.JS/jQuery/CoffeeScript项目时,我发现自己陷入了一堆回调和时间问题.我需要等待一些事情才能完成,然后发现自己陷入了一堆嵌套的回调......这让人感到困惑和难以调试.然后我找到了2个可能的解决方案jQuery deferred或IcedCoffeeScript
IcedCoffeeScript看起来很简单,只需添加await&defer.但是,我不知道它会留下来吗?StackOverflow上只有2个问题吗?与CoffeeScript相比,没有太多谈论它
另一件事是两种方法之间的区别是什么,它们似乎大致相同?除了在IcedCoffeeScript中,它看起来更像是程序代码,并且在jQuery延迟,它并没有解决我的混乱回调
我最近发现并且爱上了jQuery中使用的Deferred/Promise模式.它只是封装了许多异步用例,包括精彩的链接,过滤能力,我不敢相信我错过了这么久.
我刚刚完成重构我的AS3代码以使用优秀的CodeCatalyst/promise-as3库(https://github.com/CodeCatalyst/promise-as3),所以开始考虑回到我的C++代码并看看我是如何可以在那里实施模式.
在我自己开始编码之前,我检查过它是否已经完成,并发现std::future/ std::promise(和提升等价物),但它们非常重(它们似乎使用真正的线程等,并且具有沉重的模板语法).
所以,我的问题是:是否存在deferred/Promise模式的轻量级纯C++实现,jQuery风格?
裁判:
如何才能正确使用jQuery延迟来延迟函数返回,直到函数内的异步调用完成+获取返回值?
这是我目前的代码:
function getFields(page)
{
var dff = $.Deferred();
result = {};
$.ajax( //the async call
{
url: page,
success:
function (data)
{
//work out values for field1 & field 2 from data here
result =
{
'field1' : field1,
'field2' : field2
};
},
complete:
function()
{
dff.resolve(result); //my attempt to return the result
}
}
);
return dff.promise();
}
Run Code Online (Sandbox Code Playgroud)
我想要打印{"field1":"value1","field2":"value2"}
var result = getFields('http://something');
console.log(JSON.stringify(result));
Run Code Online (Sandbox Code Playgroud)
但是,结果的值似乎是一个jQuery对象 - 所以我做错了什么,但是什么?
谢谢!
PS对不起新手问题,我是deferreds的第一次使用者,所以我仍然掌握基本概念.
是否可以将已解析的jQuery对象重置为"未解析"状态并重新启动它的初始化和回调?
我正在做的具体事情是我在本地文件系统api上有一个jQuery延迟包装器.从那里我为我关心的事物建立更高级别的延期:
var getFs = defFs.requestQuota(PERSISTENT, 1024*1024)
.pipe (bytes) -> defFs.requestFs(PERSISTENT, bytes)
var getCacheContents = getFs.pipe (fileSystem) ->
defFs.getDirectory('Cache', fileSystem.root).pipe (dir) ->
defFs.readEntries(dir)
Run Code Online (Sandbox Code Playgroud)
现在大部分时间,当我调用getCacheContents时,我不介意返回的备忘值,实际上我更喜欢它.但是,在我想写入缓存的情况下,我真的希望能够重置该管道并让它在下次访问时重新选择并重新扫描缓存.
我可以从$ .Callbacks一起拼凑一些东西但是基于延迟的解决方案真的很理想.
jquery-deferred ×10
jquery ×6
javascript ×3
asynchronous ×2
promise ×2
ajax ×1
c++ ×1
coffeescript ×1
jquery-1.5 ×1
jquery-load ×1
progress ×1