Javascript 创造者无法解决的蓝鸟承诺模式

Javascript 创造者无法解决的蓝鸟承诺模式,javascript,modal-dialog,promise,aurelia,bluebird,Javascript,Modal Dialog,Promise,Aurelia,Bluebird,蓝鸟的Promise.defer()机制。虽然我认为我理解延迟反模式的危险,但我想知道我的用例是否需要它 我想返回一个承诺,该承诺基于来自modal*的用户输入得到解决/拒绝。模态是非阻塞的,并且本身不返回承诺。相反,当用户单击其响应时调用函数。因此,构建承诺的函数没有足够的信息在其范围内解析/拒绝 Javascript 导出类FooClass{ canDeactivate(){ this.modal.open(); this.deferred=Promise.deferred(); 归还这个承

蓝鸟的
Promise.defer()
机制。虽然我认为我理解延迟反模式的危险,但我想知道我的用例是否需要它

我想返回一个承诺,该承诺基于来自modal*的用户输入得到解决/拒绝。模态是非阻塞的,并且本身不返回承诺。相反,当用户单击其响应时调用函数。因此,构建承诺的函数没有足够的信息在其范围内解析/拒绝

Javascript
导出类FooClass{
canDeactivate(){
this.modal.open();
this.deferred=Promise.deferred();
归还这个承诺;
//如何在不延迟迁移的情况下使用'newpromise(resolver_func)'?
}
取消{
this.deferred.reject();
}
丢弃{
this.deferred.resolve();
}
}
HTML

模态头
一串文字

. 当用户试图导航离开页面时,会出现一个提示,询问他们是否要放弃更改并继续导航离开或停留在页面上。

您可以执行以下操作:

export class FooClass {

  canDeactivate() {
    this.modal.open();          

    //assign the promise to `this.promise` if you need access it later
    //you might not want to use `resolve` and `reject`. Choose better names 
    this.promise = new Promise((res, rej) => {
      this.resolve = res;
      this.reject = rej;
    });

    return this.promise;
  }

  cancel() {
    this.reject();
  }

  discard() {
    this.resolve();
  }
}
您可以这样做:

export class FooClass {

  canDeactivate() {
    this.modal.open();          

    //assign the promise to `this.promise` if you need access it later
    //you might not want to use `resolve` and `reject`. Choose better names 
    this.promise = new Promise((res, rej) => {
      this.resolve = res;
      this.reject = rej;
    });

    return this.promise;
  }

  cancel() {
    this.reject();
  }

  discard() {
    this.resolve();
  }
}

使用标准promise executor函数实际上只有两个选项

  • 您将调用resolve/reject的逻辑放在promise executor函数中,因此您可以直接从那里调用resolve/reject

  • 通过将resolve/reject捕获到可从执行器外部访问的变量中,可以公开一种调用resolve/reject的方法,或者让其他东西从执行器外部调用它

  • 如果您想要构建代码的方式与选项1不一致,并且您不想更改代码的结构方式,那么选项2就是您剩下的,而实现这一点的经典方式是使用延迟对象

    另一方面,几乎总是有一种方法可以重新构造代码,这样承诺执行者就是一个围绕逻辑的闭包,它将触发resolve/reject,并且问题可以在没有延迟的情况下得到解决。哪种方法更好取决于你的具体情况。我看到过我称之为延期的合法案例,但它更像是0.1%的案例,大多数情况下,对代码进行一点重组,使其与承诺的执行者功能完全吻合

    为了提供关于您案例细节的想法,我们需要了解调用代码,以了解如何在不使用延迟代码的情况下修改整个操作,以适应promise executor


    例如,如果显示对话框的代码也是为“取消”和“放弃”按钮添加事件侦听器的代码(而不是将该代码嵌入到HTML中),那么您可能会将所有这些代码放在一个“承诺执行器”中,在没有延迟的情况下很好地解决问题,事实上,您的HTML中会有更多代码(低调Javascript的概念)这通常被认为是一件好事。

    标准promise executor函数实际上只有两个选项

  • 您将调用resolve/reject的逻辑放在promise executor函数中,因此您可以直接从那里调用resolve/reject

  • 通过将resolve/reject捕获到可从执行器外部访问的变量中,可以公开一种调用resolve/reject的方法,或者让其他东西从执行器外部调用它

  • 如果您想要构建代码的方式与选项1不一致,并且您不想更改代码的结构方式,那么选项2就是您剩下的,而实现这一点的经典方式是使用延迟对象

    另一方面,几乎总是有一种方法可以重组代码,这样承诺执行者就是围绕逻辑的闭包,它将触发解决/拒绝,并且问题可以在没有延迟的情况下得到解决。哪种更好的方法真正取决于您的具体情况。我已经看到了我所说的延迟合法案例,但它更像是0.1%的情况,大多数情况下,对代码进行一点重新构造,使其与承诺的执行器功能保持一致

    为了提供关于您案例细节的想法,我们需要了解调用代码,以了解如何在不使用延迟代码的情况下修改整个操作,以适应promise executor


    例如,如果显示对话框的代码也是为“取消”和“放弃”按钮添加事件侦听器的代码(而不是将该代码嵌入到HTML中),那么您可能会将所有这些代码放在一个“承诺执行器”中,在没有延迟的情况下很好地解决问题,事实上,您的HTML中会有更多代码(低调Javascript的概念)这通常被认为是一件好事。

    蓝鸟有取消功能,但问题不仅仅是“无法解决”,而是延迟解决和拒绝。这是延迟模式的完美用例。蓝鸟有取消功能,但问题不仅仅是“无法解决”,而是关于d解决和拒绝都出错。这是延迟模式的完美用例。是的,这就是我在问题中链接到()的延迟迁移。我知道(这只是延迟模式),但我想知道是否有其他方式来考虑我的用例。但延迟模式似乎完美地包含了解决方案。是的,这就是我在问题中链接到()的延迟迁移。我知道(这只是延迟模式),但我想知道是否有其他方式来思考我的用例。但延迟模式似乎完美地包含了解决方案。