如何使用Promise控制setTimeout

问题描述

var functionsArray = [
  function() {
        setTimeout(function() {
        console.log(1);
    },100);
  },function() {
    setTimeout(function() {
        console.log(2);
    },200);
  },function() {
        setTimeout(function() {
            console.log(3);
    },10);
  }
],

我有一个像上面的函数数组(其中的函数数未知)。我想编写一个函数,将这个数组作为参数并按顺序执行。在上面的示例中,我希望它按顺序记录1,2,3。由于Promise.all不保证执行顺序,是否可以在没有回调地狱的情况下实现这一目标?

解决方法

您无法从仅调用setTimeout的函数中获得承诺-它需要一些帮助,例如:

function after(n,f) {
  return () => new Promise(resolve => {
    setTimeout(() => {
        resolve(f());
    },n);
  });
}

用法:

var functionsArray = [
  after(100,() => console.log(1)),after(200,() => console.log(2)),after( 10,() => console.log(3)),];

使用该数组,您可以依次依次await每个函数:

for (let f of functionsArray) {
  await f();
}
,

您可以编写一个简单的setTimeoutPromise函数:

function timeoutPromise(time = 0){
  return new Promise(resolve => setTimeout(resolve,time)
} 


await timeoutPromise(10);
console.log('waited 10 sec')
timeoutPromise(20).then(() => console.log('waited 20 sec')

//make a new array as you like

Promise.all([
 timeoutPromise(100).then(() => console.log(1)),timeoutPromise(200).then(() => console.log(2)),timeoutPromise(300).then(() => console.log(3))
])