Javascript:从传递给Promise构造函数的函数中访问Promise对象

Javascript:从传递给Promise构造函数的函数中访问Promise对象,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我正在尝试创建一个新的javascript Promise,在传递给新Promisefunc的函数中,我希望能够访问我创建的Promisefunc对象,以便在发生某些事情时存储和使用它来解决问题,而不是调用函数从Promise函数中完成工作 我试过: let promise = new Promise((resolve, reject) => { this._setupPromise = { promise, resolve, reject }; }); 当然,promise变量

我正在尝试创建一个新的javascript Promise,在传递给新Promisefunc的函数中,我希望能够访问我创建的Promisefunc对象,以便在发生某些事情时存储和使用它来解决问题,而不是调用函数从Promise函数中完成工作

我试过:

let promise = new Promise((resolve, reject) => {
    this._setupPromise = { promise, resolve, reject };
});
当然,promise变量还没有设置,所以这个.\u setupPromise.promise是未定义的

我可以这样修改它,将承诺添加到新承诺之外的对象中,但感觉不太对,因为它可能在承诺构造函数之前运行:

this._setupPromise = {};
let promise = new Promise((resolve, reject) => {
    this._setupPromise.resolve = resolve;
    this._setupPromise.reject = reject;
});
this._setupPromise.promise = promise
有什么好办法解决我的难题吗


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

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

将我的注释添加到答案中,并添加更多解释,因为它实际上就是您要寻找的答案:


第二个代码块就是这样做的。promise变量本身没有值,直到执行器返回,然后构造函数返回,所以在执行器和promise构造函数完成之前,您不能将其分配给其他对象

因为在executor函数中没有任何异步代码,所以事情将按顺序执行,所以这看起来不会是一个问题

您可能会发现,使用一个延迟对象(它只封装了resolve和reject函数的保存)更干净、更可重用。然后,你可以做:

this._deferred = new Deferred();
稍后,您可以执行以下任一操作:

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

如果您描述了您试图解决的总体问题,我们可能会提出一种完全不同的方法来解决实际问题

第二个代码块是实现这一点的唯一方法。如果您描述了您试图解决的总体问题,我们可能会提供一种完全不同的方法来解决实际问题,但是对于这种特定的方法,您的第二个代码块是您唯一的选择。在执行器返回之前,承诺本身不会被定义,因此在返回之后才能将其分配给某个对象。因为它可以在承诺构造函数之前运行-这就是您要做的mistaken@JaromandaX那么,Promise构造函数是否始终同步运行到完成?如果是这样的话,我在对象中存储promise引用的第二个代码块应该是好的。同步部分将是好的,因为这里没有异步发生,所以应该是fine@JohnMorris是否要将_setupPromise保存在全局范围内,以便从Element轻松访问它?对吗?如果是这样,我认为您可以将_setupPromise变量转换为promise本身。