警告:这个问题试图通用,所以我使用伪代码。它更多地是关于技术,而不是针对特定问题的实际解决方案。
我的问题是我有一个函数可以对服务器进行多次异步调用来收集信息,我想在另一个函数中使用该函数的结果。在实际结果出现之前,人们如何进行临时调整?
伪代码示例:
var getsomething = function(objs) {
var results = objs.map(getsomethingforoneobj);
$.when.apply(this,results).done(function() {
var result;
for (var i = 0; i < arguments.length; i++) {
//do something with the data to augment the variable 'result'
}
console.log("load finished");
console.log(result);
return result;
});
}
var getsomethingforoneobj = function(obj) {
var url = "blabla"
return $.ajax({
async:true,
url:url,
success : function(data) {
return data;
}
});
}
$(function() {
var myobjs = [{},{},{},...]
var a = getsomething(myobjs); //this is where I would want to temporize
var b = a_function_of_a(a);
//use b in the rest of the code
});
一个解决方案显然是以同步的方式完成所有事情,但我已经知道这是非常糟糕的形式。
欢迎所有帮助!
答案 0 :(得分:0)
答案 1 :(得分:0)
我建议您为自己的方案async waterfall。
但是如果你不想导入外部库,你可以查看这个函数Finalize,它允许你排队钩子并在从q中删除所有钩子时执行一个函数。
对于你的情况,它可能是这样的:
...
$(function() {
var a = null;
var b = null;
var myobjs = [{},{},{},...]
var req_set = new Finalize(function() {
console.log(a, b);
});
var hook1 = req_set.queue();
getsomething(myobjs, function(err, res) {
a = res
hook1();
}); //this is where I would want to temporize
var hook2 = req_set.queue();
a_function_of_a(a, function(err, res) {
b = res;
hook2();
});
req_set.exec();
});
我还将您的功能更改为Error-First Callback