【问题标题】:Is it an anti pattern that Promise with resolve and reject as property?why?将 Promise 与 resolve 并拒绝作为财产是否是一种反模式?为什么?
【发布时间】: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


【解决方案1】:

它本身可能不是“反模式”,但我只会在绝对必要时公开rejectresolve。这不是这里的情况。您可以将承诺或数据存储在变量中:

let promise;

async function someFunctionMustHaveFetchedData(){
    if (!promise) {
      promise = fetch('...');
    }
    let data = await promise;
    // do something after deferred resolved
}

【讨论】:

    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2011-10-02
    • 2017-12-22
    • 2018-09-24
    • 2017-05-24
    相关资源
    最近更新 更多