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

标签 javascript jquery ajax

我有一个函数,在超时时调用 ajax 调用。我还有一个按钮单击调用,如果 ajax 调用正在运行,我不想在 ajax 调用完成之前执行该调用。如果ajax调用没有运行,我想运行按钮点击代码。

处理这个问题的最佳方法是什么?使用一个变量来检查 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
}

最佳答案

这里的解决方案是使用 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 将仅在请求完成后解析。

// mocks
const $ = {ajax:()=>(console.log("ajax starting"),new Promise(r=>setTimeout(()=>{console.log("ajax done");r();},4000)))};

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

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

  // now do stuff
  console.log("button click!");
}

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

setTimeout(doAjax, 5000);
<button onclick="myBtnClick()">Click me lots</button>

关于Javascript/Jquery 从计时器调用时如何等待 AJAX 函数完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75430722/

相关文章:

javascript - Angular js - 幻灯片 View 但不是主页 - ng-animate

javascript - 获取 API 未发布到 Node.js 服务器(正文为空)

javascript - 如何将此 jQuery 函数转换为 'if' 语句

javascript - 如何在 jquery ajax 中处理 List<object>?

javascript - 单击 li 项时 Jquery 更改 div 文本值

ajax - check_ajax_referer() 是如何工作的?

javascript - 通过 jQuery 重置表单不清除 ckeditor cktext_area 字段

javascript - 捕获输入内的值变化

ajax - react axios GET 不工作。注销 'name.toUppercase is not a function'

javascript - 在codeigniter中通过ajax删除后隐藏数据表的行(tr)