【发布时间】:2020-04-27 17:29:50
【问题描述】:
export function getDeferred () {
let resolve; let reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
promise.resolve = resolve;
promise.reject = reject;
return promise ;
};
let deferred=getDeferred();
async function fetchSomeData(){
let data=await fetch('...')
deferred.resolve(data);
}
async function someFunctionMustHaveFetchedData(){
let data = await deferred;
// do something after deferred resolved
}
我为什么要这样做?
someFunctionMustHaveFetchData 将被多次调用,但数据只能获取一次
【问题讨论】:
-
正如 Felix 所说,当您不必这样做时,这样做是一种反模式。在某些情况下,使用在外部公开解析/拒绝处理程序的 Deferred 对象是实现某些东西的更简单方法(我个人在过去 5 年中只遇到过几次),所以在我看来这是一个漂亮的罕见的情况。我刚刚在Can you write this without using a deferred? 讨论了您是否需要延迟的案例。
-
“反模式”是“仅限专家”的秘密信号......如果你使用它,你必须真正确定你在做什么,否则你肯定做错了什么。在您的情况下,您的用法看起来不错,所以...
-
@JonasWilms 不。这确实是一种反模式。专家有时确实使用类似的东西,他们将
resolve函数与承诺一起存储在某个对象上,但他们从不将其存储在承诺本身上。
标签: javascript promise es6-promise