我在浏览器中使用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)
?
答案 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!
});