2017-07-21 10 views
1

私が使用しているシステムは同期ajax呼び出しのみを行うように設計されているため、回避策を探しています。まず、関数にラップされたajax呼び出しがあります。次に、別の関数でラップして、配列に追加するときに実行されないようにします。だから私は非同期のajax呼び出し関数の2つの配列を持っています。私は最初の配列のすべてを実行し、すべてが完了するまで待っています。私は2番目の配列ですべてを実行したいと思います。これは私が今まで持っているものです関数でラップされたAjax呼び出しの配列を実行する方法が必要です

私はアイテムを通過するループを持っています。私はすでにラップされた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

WrapFunctionは約束を返しません – Vanojx1

+0

その理由は実行されていない可能性がありますか? – Monzingo

答えて

1

$.whenは約束を要求する機能は、あなたが何も返さない関数を返すされているコードの中で、これだけ包まれた関数の結果を返す:

  • ES6広がりオペレータREF
  • 機能引数をオブジェクト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>

+0

良い答えですが、 '$ .when'の不要なネストも改善します。代わりに、内側の '$ .when'の値を返し、外側の約束に' then'を適用してください。 – trincot

+0

はい、実際にネストされた 'when'を1つの関数にマージすると、私の答えが更新されます – Vanojx1

関連する問題