重用现有的 Promise 对象(如果存在)

Reusing an existing Promise object if exists

我有一个 Dialog 对象,可以显示对话框。有许多入口点可以显示对话框,例如yesNo()message()confirm() 等。但是,所有这些方法基本上都调用相同的其他方法,称为 showSimpleDialog(title, message, buttons)

我希望所有这些方法(也包括 showSimpleDialog)return 一个承诺,但有一个障碍:

yesNo() {
  return new Promise((resolve, reject) => {
    axios
      .get(......)
      .then(this.showSimpleDialog(...));
  }
}

如您所见,在上面的示例中,我被阻止 returning showSimpleDialog 将做出的承诺或将实例化的 Promise 传递给 showSimpleDialog。

前者是不可能的,因为当我们可以访问它时,我们已经处于不同的 Promise 中。后者是因为 Promise 对象本身在构造函数中尚不可用。好吧,从技术上讲,在这种特殊情况下它是(确切地说 因为 我们已经处于不同的 Promise 中),但是我的一些入口函数是同步的,一些是异步的,我根本做不到在这两种情况下使用相同的代码模式来实现相同的效果。

我调查了这件事并找到了 ,但作者表示该方法有缺陷并且一开始就过时了。

那么,在入口点仍然可以自由重用彼此的 Promise 的同时,return 来自所有入口点的有效 Promise 的正确方法是什么?

如果我没理解错的话,this.showSimpleDialog(...)也是return一个Promise,对吧?

如果你想 yesNo() 到 return 由 this.showSimpleDialog(...)

返回的 Promise
yesNo() { 
    return axios
        .get(......)
        .then(()=>{ 
            return this.showSimpleDialog(...);
        });
}

话虽如此,请考虑使用 async/await,尤其是在处理多个顺序承诺时,如果可能的话。

您的代码正在立即(同步)调用 this.showSimpleDialog,无需等待任何承诺(axios 解决)。这是因为代码没有将 函数 传递给 then 方法,而是 执行 this.showSimpleDialog。此执行 return 是一个承诺(大概),但 then 期望函数作为参数,而不是承诺。

因此您需要确保将回调传递给 then,并让该回调 return 成为一个承诺。这样 promise 就会被链接起来:

    .then(() => this.showSimpleDialog(...));

使该回调成为箭头函数也很重要,因为您将引用 this,它旨在成为调用 yesNothis