美文网首页
如何用setTimeout()实现同步执行?

如何用setTimeout()实现同步执行?

作者: hellokitty小丸子 | 来源:发表于2021-11-22 18:00 被阅读0次

事情起源于一个延迟机制,大致意思是:当程序运行时,需要延迟运行一部分代码,如:延迟1秒执行。直接使用setTimeout():

async function doDelay() {
    const newUserId = 123
    return newUserId
}


let userId = 0
userId = setTimeout(function () {doDelay()}, 1000)
console.log('userId:', userId)

这个时候,程序运行下来,userId打印仍出来为0。原因是setTimeout()并没有使程序等待doRetry()的执行,setTimeout()本身是一个异步的。

改进方法:
function delay() {
    return new Promise(async function (resolve, reject) {
        async function doDelay() {
            const newUserId = 123
            resolve(newUserId)
            return
        }
        setTimeout(function () { doDelay()}, 1000)
    })
}


let userId = 0
await delay()
    .then(
        function resolveResult(newUserId) {
            userId = newUserId
         }
    )
console.log('userId:', userId)

程序运行:userId打印为123

重试:其实此方式通常被用来做重试:
function retry(fn, args, timer) {
  return new Promise(async function (resolve, reject) {
    async function doRetry() {
      if (timer > 0){
        timer--
        const newUserInfo = await fn(args)
    
        if (newUserInfo.length === 0) {
          setTimeout(function () {doRetry()}, 1000)
        } else{
          const userId = newUserInfo[0].user_id
          resolve(userId)
          return
        }
      } else {
        reject()
      }
    }
    doRetry()
  })
}

async function getUserId(userName) {
  let result = []
  await testDB.transaction(async trx => {
    result = await trx('t_user').select('user_id').where({ name: userName })
  })
  return result
}

主程序:
let userId = 0
// 重试三次getUserId()
await retry(getUserId, userName, 3)
    .then(
        function resolveResult(newUserId) {
            userId = newUserId
         },
        function rejectResult() {
                    throw new Error('获取新userId失败')
         }
    )
console.log('userId:', userId)

这样:retry,console.log('userId:', userId)就会同步执行
参考:https://www.thinbug.com/q/43363385

相关文章

  • 如何用setTimeout()实现同步执行?

    事情起源于一个延迟机制,大致意思是:当程序运行时,需要延迟运行一部分代码,如:延迟1秒执行。直接使用setTime...

  • requestAnimationFrame实现动画

    setTimeout跟requestAnimationFrame的区别 setTimeout是异步执行的,遇到同步...

  • setState

    setState包在异步setTimeout里会同步执行 setState 什么时候会执行同步更新?先直接说结论吧...

  • 计时器

    setTimeout定时执行,在设定时间后会执行代码的内容,如setTimeout(function(){cons...

  • settimeout的时间定为为0有什么用

    1.JavaScript中的setTimeout()可用来延迟执行一段代码,如: setTimeout(funct...

  • setTimeout解决同步函数执行问题

    今天项目有个需求,新增活动列表和活动详情页面的分享,且这两个分享入口进入小程序只显示活动相关页面,无法看到小程序的...

  • Promise(then/catch)

    主要谈及: 是什么,怎么做,如何实现 一、setTimeout函数依次执行的传统方法 二、实现异步函数的顺序执行 ...

  • 题目

    js: setTimeout时间延迟为何不准?单线程,先执行同步主线程,再执行异步任务队列。 如何判断变量的类型?...

  • 同步与异步

    其中当线程中没有执行任何同步代码的前提下才会执行异步代码(settimeout,事件,可是ajax之类的不清楚是不...

  • setTimeout/setImmediate/process.

    setTimeout setTimeout(setTnterval和setTimeout区别为执行次数不同 ),将...

网友评论

      本文标题:如何用setTimeout()实现同步执行?

      本文链接:https://www.haomeiwen.com/subject/yhebtrtx.html