【问题标题】:Javascript: Access Promise object from within function passed to Promise constructorJavascript:从传递给 Promise 构造函数的函数中访问 Promise 对象
【发布时间】:2018-06-25 16:09:14
【问题描述】:

我正在尝试创建一个新的 javascript Promise,并在函数中传递给 new Promise(func) 我想访问我创建的 Promise 对象,以便在发生某些事情时存储和使用以解决问题,而不是调用在 promise 函数中完成工作的函数。

我试过了:

let promise = new Promise((resolve, reject) => {
    this._setupPromise = { promise, resolve, reject };
});

当然“promise”变量还没有设置,所以this._setupPromise.promise是未定义的。

我可以像这样更改它以将 Promise 添加到新 Promise 之外的对象,但感觉不对,因为它可以在 Promise 构造函数之前运行:

this._setupPromise = {};
let promise = new Promise((resolve, reject) => {
    this._setupPromise.resolve = resolve;
    this._setupPromise.reject = reject;
});
this._setupPromise.promise = promise

我的delimma有什么好的解决办法吗?

对于任何想知道为什么我会在 Promise 构造函数中调用它之外解析/拒绝 Promise 的人,我可选地承诺一些遗留代码,并避免对某些现有用途进行大规模重构情况下,它可以帮助我选择性地解决其他地方的承诺。

【问题讨论】:

  • 您的第二个代码块是唯一的方法。如果您描述了您要解决的整体问题,我们可能会提出一种完全不同的方法来解决实际问题,但是对于这种特殊方法,您的第二个代码块是您唯一的选择。在 executor 返回之前,promise 本身是没有定义的,所以直到之后你才能将它分配给某个东西。
  • since it could run before the Promise constructor function - 那是你弄错了
  • @JaromandaX 那么,Promise 构造函数是否总是首先(同步)运行完成?如果是这样,我在对象中存储承诺引用的第二个代码块应该没问题。
  • 同步部分会,因为你没有异步发生在那里,你应该没问题
  • @JohnMorris 您想将 _setupPromise 保存在全局范围内,以便您可以从其他地方轻松访问它,对吗?如果是这样,我认为您可以将 _setupPromise 变量转换为承诺本身。

标签: javascript promise es6-promise


【解决方案1】:

问题由 cmets 中的 jfriend00 和 Jaramanda X 回答。 在我的情况下,我的第二个代码块是执行此操作的正确方法,因为传递给 Promise 构造函数的函数在 Promise 构造函数退出之前执行。
这意味着在我的情况下,函数中没有异步代码,之后我可以安全地分配承诺引用。

【讨论】:

    【解决方案2】:

    将我的评论变成答案(并添加更多解释),因为它实际上是您正在寻找的答案:

    您的第二个代码块就是这样做的方法。在 executor 返回并且构造函数返回之前,promise 变量本身没有值,因此在 executor 和 promise 构造函数完成之前,您不能将其分配给其他东西。

    由于您在执行器函数中没有任何异步代码,因此事情将按顺序执行,因此这看起来不是问题。

    您可能会发现使用 Deferred 对象(它只是封装了 resolvereject 函数的保存)作为 shown here 更简洁,更可重用。然后,你可以这样做:

    this._deferred = new Deferred();
    

    然后,您可以执行以下任何操作:

    this._deferred.resolve(...);
    this._deferred.reject(...);
    this._deferred.then(...);
    this._deferred.catch(...);
    let p = this._deferred.promise;
    

    如果您描述了您要解决的整体问题,我们或许可以提出一种完全不同的方法来解决实际问题。

    【讨论】: