我被要求創建這樣一個名為的物件foo,它可以鏈接函式log和wait.
例如:
foo.log('breakfast').wait(3000).log('lunch').wait(3000).log('dinner');
在這種情況下,它breakfast首先列印,等待 3 秒,列印lunch,然后在 3 秒后列印dinner。
我試過這樣的事情,但它不起作用。我錯過了什么?
var foo = {
log: function(text){
console.log(text);
return foo;
},
wait: function(time) {
setTimeout(function() {
return foo;
}, time);
}
}
foo.log('breakfast').wait(3000).log('lunch').wait(3000).log('dinner');
uj5u.com熱心網友回復:
使用 Promise 總是更好。此功能的實作可能是;
class Foo {
constructor(){
this.promise = Promise.resolve();
}
log(txt){
this.promise = this.promise.then(_ => console.log(txt))
return this;
}
wait(ms){
this.promise = this.promise.then(_ => new Promise(v => setTimeout(v,ms)));
return this;
}
}
var foo = new Foo();
foo.log("happy").wait(1000).log("new").wait(1000).log("year");
uj5u.com熱心網友回復:
作為記錄,Redu 的優秀答案沒有類糖。
const foo = {
promise: Promise.resolve(),
log(txt) {
this.promise.then(_ => console.log(txt));
return this;
},
wait(ms) {
this.promise = this.promise.then(_ => new Promise(v => setTimeout(v, ms)));
return this;
}
};
// OR
const Foo = (defaultMs = 1000) => {
let promised = Promise.resolve();
return {
log(txt) {
promised.then(_ => console.log(txt));
return this;
},
wait: function(ms) {
promised = promised.then( _=>
new Promise( rs => setTimeout(rs, ms || defaultMs) ) );
return this;
}
};
};
foo.log("Happy").wait(1000).log("new").wait(1000).log("year");
Foo().wait(3000)
.log(`** From Foo ;)`).log(`Happy`).wait().log("new").wait().log("year");
uj5u.com熱心網友回復:
將呼叫wait放在前一個內部,并作為最后一個專案,就像一個遞回函式。
meals=['breakfast','elevenses','lunch','afternoon tea','dinner','supper'];
c=0;
wait=t=>{setTimeout(function() {
if (c<meals.length) document.write(meals[c ],'<br>');wait(500);
}, t);}
wait(500);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/401246.html
標籤:javascript 异步
上一篇:為什么我的組件沒有接收異步資料?
下一篇:DynamoDB異步REST呼叫
