Javascript/Jquery当从计时器调用时,如何等待 AJAX 函数完成?

yebdmbv4  于 2023-02-15  发布在  jQuery
关注(0)|答案(2)|浏览(126)

我有一个函数,我从一个timeout调用,它发出一个 AJAX 调用;我还有一个button click调用,如果ajax调用正在运行,我不想在ajax调用完成之前执行它;如果ajax调用没有运行,我想运行button click代码。
处理这个问题的最好方法是什么?用一个变量来检查 AJAX 函数是否正在运行,或者有别的方法吗?
下面是我的伪代码

setTimeout(doAjax, 5000);

function doAjax() {
  $.ajax({
        url: "xxx.com/dosomething",
        dataType: 'json',
        type: 'POST',
        cache: false,
        contentType: 'application/json; charset=utf-8',
        success: function (data) { doSuccess() },
        error: function (data, status, jqXHR) { doError() }
    });
}

function myBtnClick() {
  // wait for doAjax call to complete if running
}
vhmi4jdf

vhmi4jdf1#

这里的解决方案是使用promise来维护异步代码的状态。

let clickDelayPromise = Promise.resolve(); // initial value

async function myBtnClick() {
  // wait for the promise to resolve
  await clickDelayPromise;

  // now do stuff
}

function doAjax() {
  // assign the $.ajax deferred (promise) to the variable
  clickDelayPromise = $.ajax({
    // ...
  });
}

最初,clickDelayPromise将立即解析,但一旦 AJAX 调用开始,promise将仅在请求完成后解析。
x一个一个一个一个x一个一个二个x

tjvv9vkg

tjvv9vkg2#

你可以通过确保你的先决条件异步操作是承诺的来实现你想要的,如果你有一个数组来存储它们,那么你可以这样做:

Promise.all(yourArray).then((values) => {
    /*Do something*/
})

概念验证:
x一个一个一个一个x一个一个二个x

相关问题