如何在javascript上实现异步和同步任务?

如何在javascript上实现异步和同步任务?,javascript,Javascript,我想用javascript实现一个构造函数,名字是Man(),它有一个异步方法,名字是sleep(ms),它将睡眠ms秒。它还有一些同步方法,比如eat() 我想实现以下目标: 连锁呼叫 异步方法和同步调用的顺序正确 例如: new Man('Tom').sleep(3).eat('dinner') // output: 'Hello, I am Tom' // After 3 seconds // output: 'Eat Dinner' 我试过这个: function Man(name)

我想用javascript实现一个构造函数,名字是
Man()
,它有一个异步方法,名字是
sleep(ms)
,它将睡眠
ms
秒。它还有一些同步方法,比如
eat()

我想实现以下目标:

  • 连锁呼叫
  • 异步方法和同步调用的顺序正确
  • 例如:

    new Man('Tom').sleep(3).eat('dinner')
    // output: 'Hello, I am Tom'
    // After 3 seconds
    // output: 'Eat Dinner'
    
    我试过这个:

    function Man(name) {
      console.log(`Hello, I am ${name}`)
      return this
    }
    Man.prototype.sleep = function(ms) {
      setTimeout(() => {
        return this
      }, ms)
    }
    Man.prototype.eat = function() {
      console.log('Eat Dinner')
      return this
    }
    

    但是它没有像预期的那样工作,它捕获了一个错误:
    uncaughttypeerror:无法读取未定义的属性“eat”

    最后,我已经制定了一个实现,但并不完美

    function Man(name) {
      console.log(`Hello, I am ${name}`)
      this.jobs = []
      this.ms = 0
    }
    Man.prototype.sleep = function(ms) {
      this.ms += ms
      setTimeout(() => {
        this.next()
      }, this.ms * 1000)
      return this
    }
    Man.prototype.eat = function(food) {
      this.jobs.push(function() {
        console.log(`Eat ${food}`)
      })
      return this
    }
    Man.prototype.jump = function() {
      this.jobs.push(function() {
        console.log('Jumping...')
      })
      return this
    }
    Man.prototype.next = function() {
      const job = this.jobs.shift()
      if (typeof job === 'function') job.call(this)
    }
    
    new Man('Tom').sleep(3).eat('dinner').sleep(4).jump()
    // output: 'Hello, I am Tom'
    // After 3 seconds
    // output: 'Eat dinner'
    // After 4 seconds
    // output: 'Jumping...'
    

    期待更好的实施。

    这里是另一个解决方案:

    const jobs = []
    const next = function() {
      const job = jobs.shift()
      if (typeof job === 'function') job()
    }
    
    function Man(name) {
      console.log(`Hello, I am ${name}`)
      setTimeout(() => {
        next()
      }, 30)
      return {
        sleep: function(t) {
          jobs.push(function() {
            setTimeout(function() {
              next()
            }, t * 1e3)
          })
          return this
        },
        eat: function(food) {
          jobs.push(function() {
            console.log(`Eat ${food}`)
            next()
          })
          return this
        },
        jump: function() {
          jobs.push(function() {
            console.log('Jumping...')
            next()
          })
          return this
        }
      }
    }
    Man('Tom').sleep(3).eat('dinner').sleep(4).jump()
    

    将第一个字符串打印到输出,返回一个对象,该对象上有一个名为
    sleep
    的函数。你尝试过什么,但没有成功?sleep()是一个异步任务,eat()是一个同步任务,问题是,如何使异步任务和同步像一个链一样执行?例如:``Man('Tom').sleep(3).eat('晚餐').sleep(2).jump().sleep(4).run()``它应该有一个通用的实现@大卫编辑了我的问题@DavidI我迟到了。但是在这里你要感谢,@Kharel,你的解决方案是在新人类('Tom')上工作。睡眠(3)。吃('晚餐'),但是cougt错误代码如下:
    新人类('Tom')。睡眠(3)。吃('晚餐')。睡眠(2)。跳跃()。