链排队回调结果
Chain queuing callbacks results
我得到了这样的循环:
for ( var current in all )
{
//load the item
prepare.load( all[current].resource , function( result ) {
doSomethingWithResult(result);
});
}
function AllItemsLoaded()
{
}
我的目标是在加载所有项目并执行回调中的代码之后执行AllItemsLoaded(),例如,对于每个项目回调都应该被调用,并且DoSomethingWithResult()应该在调用AllItemsLoadd()之前执行,所有这些项目都是异步加载的。
我尝试过Jquery Deferred/pipe,我的代码看起来像这样:
var chain = new $.Deferred().resolve();
for ( var current in all )
{
chain = chain.pipe(function(res){
prepare.load( all[current].resource , function( result ) {
doSomethingWithResult(result);
});
});
//if I do a return here, the pipe will continue without getting the result,
so I need to continue the pipe after load's callback and
doSomethingWithResult is executed
}
chain.done(AllItemsLoaded);
延迟是个好主意。然而,你需要等待承诺。以下是一种方法,用于在不按顺序执行的情况下等待所有承诺:
var loads = [];
for ( var current in all )
{
(function(){
var deferred = new $.Deferred();
prepare.load( all[current].resource , function( result ) {
doSomethingWithResult(result);
deferred.resolve(result);
});
loads.push(deferred.promise());
})();
}
$.when.apply(null, loads).then(AllItemsLoaded);
首先为每个负载创建一个新的延迟。把它的承诺放在一个集合里。加载后,解决延迟的。使用$.when()等待所有加载。
这就是您需要的吗?
发件人:http://aabs.wordpress.com/2009/12/16/sequential-script-loading-on-demand/
function LoadScriptsSequentially(scriptUrls, callback)
{
if (typeof scriptUrls == 'undefined') throw "Argument Error: URL array is unusable";
if (scriptUrls.length == 0 && typeof callback == 'function') callback();
$.getScript(scriptUrls.shift(), function() { LoadScriptsSequentially(scriptUrls, callback); });
}
我会这样处理它(如下),用自己的异步对象替换每个$.get()
,并使用它自己的完整处理程序。
$(document).ready(function() {
$.when(
$.get("ajax.php?a=b"),
$.get("ajax.php?a=c"),
$.get("ajax.php?a=d")
).then(
function() {
// both AJAX calls have succeeded
alert("All Done");
},
function() {
// one of the AJAX calls has failed
alert("One or more failed");
}
);
});
首先要使用.get()
或.post()
而不是.load()
,原因是.load()
返回jQuery,而其他两个返回jqXHR(即promise),这正是您想要的。
接下来是提供一个数组,在其中累积jqXHR承诺。
最后,您需要知道如何让$.when()
对一系列承诺采取行动,在所有承诺都得到解决(或出现错误)时采取行动。
整个事情看起来是这样的:
var promises = [];//new Array
for ( var current in all ) {
prepare.get( all[current].resource, function( result ) {
doSomethingWithResult(result);
});
}
$.when.apply(null, promises).then(AllItemsLoaded, myErrorHandler);
相关文章:
- 将web服务回调的结果绑定到Javascript中的调用函数
- 返回循环中调用的回调结果的串联
- 从回调函数返回 AJAX 结果
- MongoDB:$addToSet Meteor中的重复结果回调
- node.js+MySQL;JSON结果-回调问题&没有响应客户端
- 如何通过回调访问nodejs中的mongodb计数结果
- 而循环和回调返回不同的结果
- 如何显示查询回调数据结果仅从开始
- Node.JS- R,Python大量计算识别回调何时返回并存储该结果
- 咖啡脚本化的 ajax 调用结果在实际成功时失败回调
- Meteor.js HTTP.get 获取 JSON 引号并解析结果似乎包含一个回调函数
- 如何使用异步并行将所有回调结果合并到最终回调中
- 根据多个回调结果的结果执行最终回调
- 我是否需要为每个具有等待结果回调的方法关闭
- 我想要一些在另一个回调函数内部的结果
- 使用 AJAX 回调更新挖空可观察数组会生成随机排序的结果
- 为什么我在 JavaScript 中的回调不适用于异步结果
- 为什么异步并行回调会返回意外结果
- 承诺链接:在next-then回调中使用上一个承诺的结果
- Node.js回调错误和结果澄清