通过数组运行以异步方式发出发布请求-Javascript

时间:2019-01-10 00:20:59

标签: javascript

我当前正在尝试向另一个页面发出多个发布请求以运行功能服务器端。由于这些请求是API调用的一部分,因此响应时间因调用而异。所以我试图从数组中运行调用,在调用下一个请求之前,调用将等待函数的响应。当前,由于Im使用forEach循环,因此所有呼叫都同时进行。

function update () {

   ints.forEach(value => {
        call(value['int']);  
   });

   location.reload();    
}

function call (value) {
    $.post('PATH TO API CALL'
    ).success(function(resp){
        $.post('PATH TO FUNCTION'
        ).success(function(resp){
            // function returns true when completed
        });
   });

我希望函数“ update”通过函数“ call”运行,以等待函数“ call”的响应完成。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

最简单的调整是同时使用两个功能async,这样您就可以在await循环中call每个for(并且call也{ {1}}个await):

.post

还请确保async function update() { for (let i = 0; i < ints.length i++) { // the array will be iterated through serially, // waiting for the previous call to complete before sending out another await call(ints[i]); } // the next line will only run once all iterations have finished: location.reload(); } async function call(value) { const resp1 = await $.post('PATH TO API CALL' ...); // do stuff with resp1, if needed const resp2 = await $.post('PATH TO FUNCTION', ...) // do stuff with resp2, if needed } 的使用者.catch处理可能引发的任何错误。

答案 1 :(得分:0)

@CertainPerformance提供的答案肯定有效。但是,这就是我的做法。

我将运行for的{​​{1}},然后使用{{1}立即执行它们,而不是运行array循环并以瀑布的方式执行每个请求。 }。如果实际上您确实需要以瀑布方式运行诺言(下一个调用需要来自前一个值的响应),那么promises可能不是最好的选择。在所有其他情况下,我会改用它。

Promise.all

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all