实现一个函数的链式调用

实现一个LazyPig,可以按照以下方式调用:
/* LazyPig(“Peggy”)输出:
Hello,I’m Peggy!

LazyPig("Peggy").sleep(10).eat("dinner")输出
Hello,I'm Peggy!
//等待10秒..
Wake up after 10
Eat dinner~

LazyPig("Peggy").eat("dinner").eat("supper")输出
Hello,I'm Peggy!
Eat dinner~
Eat supper~

以此类推。
*/
//最开始:
function LazyPig(name){
	return new Lazy(name)
}
function Lazy(name){
	this.name = name;
	console.log('Hi, 我是' + name)
}
Lazy.prototype = {
	eat: function(smt){
		console.log(this.name + ' is eating ' + smt)
		return this
	},
	sleep: function(time){
		setTimeout(()=>{
			console.log(this.name + ' wake up !')
		}, time * 1000)
		return this;
	}
}
LazyPig('哼哼').eat('dinner').sleep(5)

发现有点不合题意,如果eat在sleep之后调用,也是紧跟着name直接log出来了,应该在sleep 5s之后 跟在sleep之后

function LazyPig(name){
	return new Lazy(name)
}
function Lazy(name){
	this.name = name;
	this.task = [];
	console.log('Hi, 我是' + name)
	let _this = this;
	let fn = (function(){
		return function(){
			_this.next()
		}
	})()
	this.task.push(fn)
	setTimeout(()=>{
		_this.next()
	},0)
}
Lazy.prototype = {
	next: function(){
		var fn = this.task.shift()
		fn && fn()
	},
	sleep: function(time){
		let _this = this;
		let fn = (function(time){
			return function(){
				setTimeout(()=>{
					console.log(_this.name + ' Wake up !')
					_this.next()
				}, time * 1000)
			}
		})(time)
		this.task.push(fn)
		return this;
	},
	eat: function(smt){
		let _this = this;
		let fn = (function(smt){
			return function(){
				console.log(_this.name + ' is eating ' + smt);
				_this.next()
			}
		})(smt)
		this.task.push(fn)
		return this;
	}
}
LazyPig('哼哼').sleep(5).eat('早饭')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值