如何在所有Promise完成后使用setTimeout()?

3
我试图在所有承诺完成后将超时设置为承诺函数,但它不起作用。请看我的代码。

function cashierPromise() {
  return new Promise(function(resolve, reject) {
    resolve();
  });
}

function pharPromise() {
  return new Promise(function(resolve, reject) {
    resolve();
  });
}


$(document).ready(function() {
  $('#test1').click(function() {

    Promise.all([cashierPromise(), pharPromise()])
      .then(values => {
        console.log('promise all')
        setTimeout(cashierPromise, 5000);
        setTimeout(pharPromise, 5000);
      })
      .catch(error => {
        console.log(error.message)
      });
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button type="button" id="test1" class="btn">TEST1</button>

这是不是这样的呢?[cashierPromise, pharPromise] -> 全部完成-> 重新调用 -> 全部完成 -> 重新调用


那么你想做什么?目前还不是很清楚。 - Jack Bashford
你在这里尝试实现重复循环类似的行为吗? - Dacre Denny
我想在所有操作完成后重新调用函数。 - Thank u stack
记得是哪个函数? - Dacre Denny
函数 cashierPromise,pharPromise - Thank u stack
3个回答

1
我理解您的意思是这样的:在一定时间间隔后再次调用同一个函数。如果我理解有误,请指正。
$(document).ready(function () {
    $('#test1').click(runPromise);
});

function runPromise() {
    Promise.all([cashierPromise(), pharPromise()])
        .then(values => {
            console.log('promise all')
            setTimeout(runPromise, 5000);
        })
        .catch(error => { 
          console.log(error.message)
        });
}

1

如果我理解正确,您希望在单击按钮后无限期执行承诺。

实现这一点的方法之一是:

function cashierPromise() {
  return new Promise(function(resolve, reject) {
    console.log('cashierPromise')
    resolve();
  });
}

function pharPromise() {
  return new Promise(function(resolve, reject) {
    console.log('pharPromise')
    resolve();
  });
}

/* Introduce an interation function to encapsualte logic for a single
iteration/cycle of the function calls */
function iteration(number) {

  number = number || 0;
  console.log(`iteration:${number}`);

  Promise.all([cashierPromise(), pharPromise()])
    .catch(error => {
      console.log(error.message)
    })
    .then(() => {

      /* Impose 5second delay */
      return new Promise((resolve) => setTimeout(resolve, 5000))
    })
    .then(() => {

      /* Re-run iteration causing the cashierPromise() and pharPromise() 
      function to be called again */
      iteration(number + 1);
    });

}

$(document).ready(function() {


  $('#test1').click(function() {
    /* Invoke first iteration to call the two promises */
    iteration();
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<button type="button" id="test1" class="btn">TEST1</button>


0

使用async/await怎么样?

function cashierPromise() {
  return new Promise(function(resolve, reject) {
    resolve();
  });
}

function pharPromise() {
  return new Promise(function(resolve, reject) {
    resolve();
  });
}

function wait(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

$(document).ready(function() {
  $('#test1').click(async function() {

    try {
      for(;;) {
        const value = await Promise.all([cashierPromise(), pharPromise()]);
        console.log('promise all');
        await wait(5000);
      }
    } catch(error) {
      console.log(error.message)
    }
    
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button type="button" id="test1" class="btn">TEST1</button>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接