【问题标题】:Is there a way to know if a `resolve` function has been called有没有办法知道是否调用了“resolve”函数
【发布时间】:2019-11-17 03:02:23
【问题描述】:

我将resolve 函数作为参数传递,我必须知道它是否在某个地方被调用过。与其手动维护状态,我想知道是否有一个函数可以为我做这件事。

const p = new Promise((resolve, reject) => {
  f(resolve)
  g(resolve)
}

如果在f 中调用了resolve,那么g 应该有不同的行为,例如

const arr = [1,2,3]
const g = resolve => {
  if(resolve has been called) {
    do nothing 
  } else {
    const el = arr.pop()
    resolve(el)
  }
}

我想要一个函数f(resolve) == true|false


我知道目前还没有这样的标准函数,因为它没有包含在 Promise 规范中。所以我要求一个已经在浏览器或 polyfill 中实现的提案。

如果现在两者都没有,我将把这个问题留在这里,以防将来有一天,会有一个。

【问题讨论】:

  • resolve 函数没有什么特别之处,它只是一个普通函数。因此,您基本上是在询问是否有一种方法可以判断之前是否调用过函数,而无需将其编码到函数本身中。我不这么认为。
  • @Barmar 是的,我同意你的观点......但是resolve 本身确实保持这样的状态,即如果它已被调用,并且在某种意义上,它有点特别,它是由浏览器实现的。所以我想知道是否有 API 可以为我查询。
  • 我建议必须有一种更简单的方法来解决您的问题。这听起来像XY problem
  • 如果你是f函数的作者,那么当它调用resolve时,你当然可以让它返回true。我在这里想念什么?还是我对您的问题中f 的两种不同定义感到困惑?
  • “在浏览器中实现”:Promise 规范与浏览器无关。它是原生 EcmaScript 的一部分。

标签: javascript es6-promise


【解决方案1】:

您可以创建一个跟踪调用的包装函数:

const p = new Promise((resolve, reject) => {
    const resolveContext = {
        didResolve: false
    };
    const wrappedResolve = (...args) => {
        resolveContext.didResolve = true;
        resolve(...args)
    };
    wrappedResolve.context = resolveContext;
    f(wrappedResolve)
    g(wrappedResolve)
}

现在你的g函数可以访问wrappedResolve.context.didResolve

【讨论】:

  • 这是“手动维护状态”,OP 在他们的问题中提到。
猜你喜欢
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2014-09-11
相关资源
最近更新 更多