我正在使用的系统只是为了进行同步ajax调用,所以我正在寻找一种解决方法。首先,我有一个包含在函数中的ajax调用。然后我将它包装在另一个函数中,这样在将它添加到数组时就不会执行它。所以我有两个异步ajax调用函数数组。我想在第一个数组中执行所有操作,然后等到一切都完成。然后我想在第二个数组中执行所有操作。这就是我到目前为止所拥有的
我有一个遍历项目的循环,我为每个项目都有一个wrap函数,它接受我已经包含的ajax调用,这样它就不会执行并将它存储在如下所示的数组中
var postpromises = [];
var WrapFunction = function (fn, context, params) {
return function () {
fn.apply(context, params);
};
}
var postPromise = WrapFunction(ajaxFunction, this, [{
url: url,
data: j,
async: true,
type: 'POST',
success: function (data) {
//success
},
error: function (xhr, textStatus, errorThrown) {
//error
}
}]);
postpromises.push(postPromise);
然后我有相同的验证代码。所以在我转到下一页之前,我有以下内容
$.when.apply(undefined, postpromises).then(function () {
console.log();
$.when.apply(undefined, validatepromises).then(function () {
console.log();
});
});
问题在于,当我到达上面的代码时,我的postpromises
都没有被执行,所以我觉得我可能在这里遗漏了一些东西。
想法?
答案 0 :(得分:1)
函数$.when
需要一个promise,在你的代码中你返回一个什么都不返回的函数,所以只返回包装函数的结果:
var postpromises = [];
var validatepromises = [];
function f1() {
var fakePromise = $.Deferred();
setTimeout(() => {
fakePromise.resolve("IM RESOLVED!!");
}, 500);
return fakePromise.promise();
}
//OLD ONE
/*var WrapFunction = function (fn, context, params) {
return function () {
fn.apply(context, params);
};
}*/
var WrapFunction = function(fn, context, params) {
return function() {
return fn.apply(context, params);
}();
}
var postPromise = WrapFunction(f1, this, []);
postpromises = [postPromise];
var validatePromise = WrapFunction(f1, this, []);
validatepromises = [validatePromise];
//OLD ONE
/*$.when.apply(undefined, postpromises).then(function(res) {
console.log(res);
$.when.apply(undefined, validatepromises).then(function(res) {
console.log(res);
});
});*/
$.when.apply(null, [...postpromises, ...validatepromises]).then(function() {
console.log([].slice.call(arguments))
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>