如何将jQuery Deferred对象转换为ES6 Promise

Dom*_*see 29 javascript jquery

这是将jQuery转换Deferred为的正确方法Promise吗?

var p = Promise.resolve($.getJSON('api/values', null));
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以做到这一点?

有什么限制?我已经读过某个地方,jQuery延迟不支持异常,所以我假设从延迟创建的承诺都不会.它是否正确?

And*_*ler 9

我不确定这是否有效.我建议:

var p = new Promise(function (resolve, reject) {
  $.getJSON('api/values', null)
    .then(resolve, reject);
});
Run Code Online (Sandbox Code Playgroud)

最好你可以创建一个适应器功能,如:

var toPromise = function ($promise) {
  return new Promise(function (resolve, reject) {
    $promise.then(resolve, reject);
  });
});

var p = toPromise($.getJSON('api/values', null));
Run Code Online (Sandbox Code Playgroud)

  • 避免使用[`Promise`构造函数反模式](http://stackoverflow.com/q/23803743/1048572),而只需使用`Promise.resolve`! (2认同)

nox*_*nox 8

是的,Promise.resolve()API支持thenable作为参数.所以传递一个jquery延迟对象就可以了.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve#Resolving_thenables_and_throwing_Errors

  • 请记住,这只适用于你只对第一个jQuery ajax参数感兴趣,即如果你想要`.then(function(data,textStatus,jqXhr){})`那么这将不起作用,因为`Promises `只支持一个参数.你需要手动将jQuery'promise'转换为`new Promise(...)`并编组那里的参数. (4认同)