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

时间:2018-01-16 21:12:59

标签: javascript promise es6-promise

我正在尝试创建一个新的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之外的人,我可选宣传一些遗留代码,并避免一些现有用途的大量重构在某些情况下,它可以帮助我解决其他地方的承诺。

2 个答案:

答案 0 :(得分:1)

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

你的第二个代码块就是这样做的。 promise变量本身在执行程序返回之前没有值,然后构造函数返回,因此在执行程序和promise构造函数完成之后,您无法将其分配给其他内容。

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

您可能会发现使用Deferred对象(仅将Detailed report >resolve函数的保存封装为shown here)更清晰,更可重用。然后,你可以这样做:

reject

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

this._deferred = new Deferred();

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

答案 1 :(得分:0)

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