且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

承诺链中的承诺延迟

更新时间:2022-10-21 22:12:45

答案是好的,但是他们等待太久,因为所有答案都等待或者不是实际操作已经超过了50ms。



您可以使用 Promise.all p>

  const delay = ms =>新的Promise(resolve => setTimeout(resolve,ms)); 
let paramerterArr = ['a','b','c','d','e','f']
parameterArr.reduce(function(promise,item){
return promise.then(function(result){
return Promise.all([delay(50),mySpecialFunction(item)]);
})
},Promise.resolve() )


Let's say I am using the following code to run a couple of promises in series:

let paramerterArr = ['a','b','c','d','e','f']
parameterArr.reduce(function(promise, item) {
  return promise.then(function(result) {
    return mySpecialFunction(item);
  })
}, Promise.resolve())

The code simply calls mySpecialFunction (which returns a promise), waits for the promise to be resolved and then calls mySpecialFunction again etc. So the function is called once for every element in the array, in the correct order.

How could I make sure that there is a delay of at least 50 milliseconds between every call of mySpecialFunction(item)?

It is important that the promises are executed in the right order and the execution time of mySpecialFunction varies every time.

I guess a synchronous sleep would work, but I'm not planning to run this code in a separate thread, so it would cause annoying ui freezes in the browser.

I'm not sure if setTimer could somehow be used for this. I mean I can't delay the returning of a promise.

The answers are good, but they wait too long since all the answers wait regardless of whether or not the actual operation took more than 50ms already.

You can use Promise.all for it.

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
let paramerterArr = ['a','b','c','d','e','f']
parameterArr.reduce(function(promise, item) {
  return promise.then(function(result) {
    return Promise.all([delay(50), mySpecialFunction(item)]);
  })
}, Promise.resolve())