我需要一种方法来执行函数中包含的ajax调用数组

时间:2017-07-21 15:43:01

标签: javascript ajax asynchronous promise

我正在使用的系统只是为了进行同步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都没有被执行,所以我觉得我可能在这里遗漏了一些东西。

想法?

1 个答案:

答案 0 :(得分:1)

函数$.when需要一个promise,在你的代码中你返回一个什么都不返回的函数,所以只返回包装函数的结果:

  • ES6传播运营商REF
  • function arguments object REF

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>