如何在javascript上实现异步和同步任务?
我想用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)
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)。跳跃()。