在javascript中的另一个setTimeout函数中使用setTimeout

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在javascript中的另一个setTimeout函数中使用setTimeout相关的知识,希望对你有一定的参考价值。

我有这个代码: -

    var i = 3
    var p = Promise.resolve(i)
    while (i > 0) {
      (i => {
        p = p.then(() => {
          return new Promise(function (resolve, reject) {
            console.log('start', i)        
            setTimeout(function () {
              setTimeout(() => {
                console.log('timeout')
              }, 1000);
              console.log('end', i)
              resolve()
            }, 1000)
          })
        })
      })(i)
      i--
    }
    p = p.then(data => console.log('execution ends'))

我得到这样的输出: -

start 3
end 3
start 2
timeout
end 2
start 1
timeout
end 1
execution ends
timeout

但是,我的预期输出应该是这样的: -

start3
timeout
end3
start2
timeout
end2
start1
timeout
end1

简而言之,因为我的预期输出“超时”日志应该每2秒打印一次,其他日志应该每1秒打印一次。

答案

试试这个:

var i = 3
var p = Promise.resolve(i)
while (i > 0) {
  (i => {
    p = p.then(() => {
      return new Promise((resolve) => {
        console.log('start', i)
        setTimeout(() => {
          return new Promise((resolve) => {
            setTimeout(() => {
          	console.log('timeout')
            	resolve()
            }, 1000)
          }).then(() => {
          	console.log('end', i)
          	resolve()
          })
        }, 1000)
      })
    })
  })(i)
  i--
}
p = p.then(data => console.log('execution ends'))
另一答案

以下是否正确执行?

const later = time => value =>
  new Promise(
    resolve=>
      setTimeout(() => {
        resolve(value)
      }, time)
  );
const afterOneSecond = later(1000);
Array.from(new Array(3),(i,index)=>3-index)
.reduce(
  (promise,value)=>
    promise.then(afterOneSecond)
    .then(()=>console.log("start:",value))
    .then(afterOneSecond)
    .then(()=>console.log("timeout"))
    .then(()=>console.log("end:",value)),
  Promise.resolve()
)
.then(() => console.log('execution ends'));

以上是关于在javascript中的另一个setTimeout函数中使用setTimeout的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript/jQuery 重定向到 ASP.NET MVC 中的另一个页面

在javascript中的另一个setTimeout函数中使用setTimeout

当我尝试在javascript(Nodejs)中的另一个类中访问它时,类变成一个空对象[重复]

基于javascript中的另一个数组过滤对象数组

为啥一个空数组等于一个空字符串,而不是 javascript 中的另一个空数组? [复制]

如何在javascript中的另一个子窗口的选项卡中打开子窗口?