将LocalForage与jQuery的promise库一起使用

时间:2015-08-20 18:22:17

标签: javascript jquery promise localforage

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

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

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

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

并且它可以正常工作。

最佳解决方案是什么?有没有办法将ES6 / shim promises转换为jQuery promise,而不是var deferred = $.Deferred(); es6Promise.then(deferred.resolve, deferred.reject)

1 个答案:

答案 0 :(得分:2)

  

最佳解决方案是什么?

不要这样做。不要使用$.when.apply。不要将ES6承诺转换为jQuery延迟。

ES6承诺在很多方面比jQuery延迟更好 - 最重要的是,它们遵循Promises / A +并且可以互操作,使同化成为无问题。 You can easily use them with jQuery.在您的情况下,它应该是

var results = _.map(keys, localForage.getItem);
Promise.all(results).then(function(arr) {
  // iterate over arr - no more arguments object!
});