如何在jQuery上调用相同的帖子,有一个快捷方式吗?

时间:2018-03-09 12:12:50

标签: javascript jquery ajax

我需要在完成时启动相同的ajax请求。我这样做的原因是因为setInterval不提供给我,所以不能保证第一秒内发出的所有请求都将完成,直到第二次setInterval调用。

我看到了一切,因为一个setInterval暂停函数(谁不存在),直到jQuery ajaxStop函数在这种情况下才有用,但对我来说很难实现,所以我意识到最合乎逻辑的自然方式当请求完成时,它会在自己内部调用相同的请求。

任何人都有一个想法,如何调用相同的ajax请求,而不是在回调中再次写入。我认为有更好的方法可以做到这一点,但我没有找到任何关于此的内容。

这是我的代码:

$.post('{% url "orderbook>get-available-balance" %}', {symbol: vm.base_currency}, function(response) {
                        vm.base_currency_balance = response.available_balance;
                    });

我想要的是:

var post_1 = $.post('{% url "orderbook>get-available-balance" %}', {symbol: vm.base_currency}, function(response) {
                        vm.base_currency_balance = response.available_balance;

                        post_1();
                    });

有一种方法可以本地执行此操作或以正确的方式实现此行为吗?

抱歉,我不是那种Javascript的人。

2 个答案:

答案 0 :(得分:1)

如果你想反复调用相同的ajax调用,那么你只需要一点递归,我想:

function post_1() {
  $.post('{% url "orderbook>get-available-balance" %}', {symbol: vm.base_currency}, function(response) {
    vm.base_currency_balance = response.available_balance;
    post_1(); //call the same function again
  });
}

//to kick things off the first time:
post_1();

如果你想在每次调用之间有一个短暂的延迟(这也可能会绕过递归限制,我想),你可以这样做:

//...
vm.base_currency_balance = response.available_balance;
setTimeout(post_1, 3000); //call the same function again
//...etc

最好不要让ajax调用过于频繁,或者做这么长或复杂的请求 - 如果你弄错了,它会严重影响服务器的性能,特别是如果你有很多并发的话用户。

您还应该探索WebSockets之类的东西是否能为您的需求提供更有效的解决方案。

答案 1 :(得分:0)

由于您正在寻找更多优雅方法,我会做这样的事情:

var firstPostInterval = null;

function setFirstPostInterval() {
  console.log('setting timeout for setFirstPostInterval()');
  firstPostInterval = setTimeout(firstPost(), 3000);
}

function firstPost() {
  // clear timeout just in case the call is late so it won't get called again
  if (firstPostInterval != null) {
    console.log('clearing timeout for setFirstPostInterval()');
    clearTimeout(firstPostInterval);
  }

  $.post('{% url "orderbook>get-available-balance" %}', {symbol: vm.base_currency}, 
  function(response) {
    vm.base_currency_balance = response.available_balance;

    // reset timeout after finish
    setFirstPostInterval();
  });
}

// go!
firstPost();