我有以下承諾,但如果我在 ts playground 運行此代碼,它似乎無需我等待即可解決。
const promises = [later(1000)];
function later(delay:number) {
return new Promise<void>(function(resolve) {
setTimeout(() => {
console.log('test');
resolve();
}, delay);
});
}
我只希望它在我打電話時執行
await Promise.all(promises);
uj5u.com熱心網友回復:
承諾是價值而不是行動。一旦你對某事做出了承諾,相應的行動就已經發生了。
幸運的是,該語言為動作提供了一個簡潔的抽象——函式。通常使承諾“懶惰”的方式是使用回傳承諾的函式而不是承諾本身。
(注意,這與例如作為動作的可觀察物件不同,訂閱它們會呼叫它們)
uj5u.com熱心網友回復:
正如其他帖子/評論所說,later(1000)會立即進行評估,不要等待您的await Promise.all呼叫來運行承諾代碼。
您可以通過執行以下操作來實作這一目標:
const promises = [() => later(1000)];
function later(delay:number) {
return new Promise<void>(function(resolve) {
setTimeout(() => {
console.log('test');
resolve();
}, delay);
});
}
await Promise.all(promises.map(f => f()));
uj5u.com熱心網友回復:
包裹promises在匿名函式中以推遲執行。TS游樂場
// defer promises
const promises = () => [later(1000)];
// unmodified
function later(delay:number) {
return new Promise<void>(function(resolve) {
setTimeout(() => {
console.log('test');
resolve();
}, delay);
});
}
// call the promises when ready
(async function () {
await Promise.all(promises());
})()
uj5u.com熱心網友回復:
然后有thenables ; 在打字稿中PromiseLike<T>。
一個幼稚的實作:
function later(delay) {
return {
then(onResolve, onReject) {
return new Promise(resolve => {
console.log("called new Promise()");
setTimeout(resolve, delay);
}).then(onResolve, onReject);
}
}
}
但是對于這個用例,我們可以完全擺脫 Promise:
function later(delay) {
return {
then(onResolve) {
console.log("called setTimeout()");
setTimeout(onResolve, delay);
}
}
}
此實作假設您最多呼叫later(n).then(...),就像這樣await做。但不是later(n).then(...).then(...)或catch()或finally()或所有爵士樂。如果您想要所有這些,請使用回傳一個的實作Promise
function later(delay) {
return {
then(onResolve) {
console.log("called setTimeout()");
setTimeout(onResolve, delay);
}
}
}
const action = later(1000);
console.log("obj created");
// wait a bit so that its clear that new Promise ain't called immediately
setTimeout(async() => {
console.log("before awaiting");
await action;
console.log("after awaiting");
await action;
console.log("awaiting the same object a second time");
await action;
console.log("and a third time");
await later(3000); // also works
console.log("done");
}, 2000);
.as-console-wrapper{top:0;max-height:100%!important;}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355031.html
上一篇:Vuejs:輸入$refs值
