将jQuery延迟转换为具有未知执行函数的Promise / A +兼容代码

时间:2016-06-28 12:26:38

标签: javascript jquery asynchronous promise

我正在使用jQuery Deferred进行一些异步事件处理。或多或少 由于我的代码的理论纯度,我想成为Promise / A +兼容。 (该 更实际的原因是后来我可以更新我的代码以使用本机Promise 所有主流浏览器都支持它们。)

但是,我使用jQuery的特定功能延迟将它区分开来 来自Promise / A +,我不知道如何解决它。因此,我愿意 想知道如何在Promise / A +兼容中解决以下问题 方式。

问题的核心是我已经按顺序需要Promise对象了 在我知道promise的确切执行者之前将处理程序绑定到它, 因为执行者依赖于稍后会知道的一些参数。 使用jQuery延迟这不是问题,因为我可以创建一个"空" 首先推迟,将一些处理程序绑定到它,然后将执行程序附加到它。 使用Promise / A +,必须立即将执行程序作为参数给出 的构造函数,甚至会在之前立即执行 Promise的构造函数返回。

目前我有这样的事情:

// Create "empty" deferred
deferred = jQuery.Deferred();

// Attach one or more handlers
deferred.then(
  function onFullfilled( value ) {
    // do something
  }
);

// Somewhere at some totally different part of code after the particular
// URL has become known

jQuery.ajax( "www.myhost.com/my/url", {
  error: function( jqXHR ) {
    deferred.reject( jqXHR );
  },
  success: function( data, status, jqXHR ) {
    deferred.resolve( jqXHR );
  }
});

使用Promise / A +我必须做这样的事情,但我不能:

// Create promise
promise = new Promise( function( resolve, reject ) {
  // Error, ups: I do not know the URL yet
  jQuery.ajax( "www.myhost.com/my/url", {
    error: function( jqXHR ) {
      resolve( jqXHR );
    },
    success: function( data, status, jqXHR ) {
      reject( jqXHR );
    }
  });
);

// Attach one or more handlers
promise.then(
  function onFullfilled( value ) {
    // do something
  }
);

谢谢!

http://www.html5rocks.com/en/tutorials/es6/promises/

https://github.com/promises-aplus/promises-spec

https://www.promisejs.org/

https://api.jquery.com/category/deferred-object/

0 个答案:

没有答案