0

我使用 LocalForage 在浏览器中进行持久存储。我也(不幸地)在项目的其他任何地方都使用了 jQuery 的延迟和承诺。我正在尝试用来$.when收集来自许多 LocalForage 请求的响应:

var results = _.map(keys, localForage.getItem);
$.when.apply($, results).then(function() {
  // iterate over the arguments object
});

这……不行。我已验证该results数组正确包含许多 ES6 承诺对象(或在某些浏览器中来自 LocalForage 的内置 shim 的 shim 承诺)。这些对象上没有.promise函数,因此$.when不会将它们识别为 Promise,并then立即使用所有 Promise 作为参数调用匿名函数。作为测试,我尝试将上面的代码更改为

var results = _.map(keys, _.constant($.Deferred().resolve(false)));
$.when.apply($, results).then(function() {
  // iterate over the arguments object
});

它工作正常。

什么是最好的解决方案?有没有办法将 ES6/shim 承诺转换为 jQuery 承诺,除了var deferred = $.Deferred(); es6Promise.then(deferred.resolve, deferred.reject)

4

1 回答 1

2

什么是最好的解决方案?

不要这样做。不要使用$.when.apply. 不要将 ES6 Promise 转换为 jQuery deferreds。

ES6 Promise 在很多方面都比 jQuery deferreds 好——最重要的是,它们遵循 Promises/A+ 并且是可互操作的,这使得同化不是问题。您可以轻松地将它们与 jQuery 一起使用。在你的情况下,它应该是

var results = _.map(keys, localForage.getItem);
Promise.all(results).then(function(arr) {
  // iterate over arr - no more arguments object!
});
于 2015-08-20T19:36:37.473 回答