Javascript 在变更事件中使用ajax承诺

Javascript 在变更事件中使用ajax承诺,javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,假设您在发生如下更改事件时执行ajax请求: MyClass.prototype.bindChangeEvent = function(){ $(document).on('change', '#elementid', function(){ var $element = $(this); $.ajax({ url: '/someurl' }); }); } 现在,在客户机代码中,如何将done/fail/always回调附加到ajax承诺上 您不能

假设您在发生如下更改事件时执行ajax请求:

MyClass.prototype.bindChangeEvent = function(){
  $(document).on('change', '#elementid', function(){
    var $element = $(this);
    $.ajax({
      url: '/someurl'
    });
  });
}
现在,在客户机代码中,如何将done/fail/always回调附加到ajax承诺上

您不能从ajax请求返回承诺,因为它只在更改事件中创建

有没有办法提前创建一个承诺,并告诉jQuery将该承诺用于特定的ajax请求

换句话说,有没有一种方法可以做到:

MyClass.prototype.bindChangeEvent = function(){
  var promise = new Promise;
  $(document).on('change', '#elementid', function(){
    var $element = $(this);
    $.ajax({
      url: '/someurl'
      promise: promise
    });
  });
return promise;
}    

您可以使用promise构造函数回调:

MyClass.prototype.bindChangeEvent = function(){
  var promise = new Promise(function (resolve, reject) {
    $(document).on('change', '#elementid', function(){
      var $element = $(this);
      $.ajax({
        url: '/someurl'
      }).then(resolve, reject);
    });
  });
  return promise;
}

但是请注意,一旦承诺得到解决,它将不再用于通知第二次更改,因此您必须在每次更改后创建一个新的承诺,这意味着您必须再次调用
bindchangevent
。我不认为这比使用普通事件侦听器模式更实用。

您试图解决的用例和更高级别的问题是什么?还有其他方法,例如将done/fail/always作为参数传递,但这似乎并不干净。返回这样一个承诺似乎更面向对象,即该代码的客户端可以附加他们的done/fail/always关注点,而不必担心变更事件的绑定是如何实现的。但是该事件可能会发生很多次,因此不清楚您为什么要返回任何内容,或者用例会说什么“每当发生此事件时,发出此ajax请求,并在该ajax请求完成/始终/失败时回调此调用,但要以面向对象的方式而不是功能性的方式(传递参数)“也许在js中要求做面向对象的事情是我错的地方。我希望有一种方法可以简单地返回一个对象,作为每个事件的承诺@trincot的答案与我想要的最接近,但没有成功,因为Promise的答案不会被重复。因此,这可能是Promise对象的一个限制。只需调用回调。或者,如果需要自定义事件与dom元素交互,也可以设置自定义事件