【发布时间】:2014-08-20 15:11:14
【问题描述】:
!!!这个问题不是关于如何将一组承诺传递给when 函数,因为file 方法和onload 都没有返回承诺,它不是重复的
我有一个自定义方法执行不返回承诺的异步函数。我的自定义方法确实返回了一个承诺。实现该功能的正确方法是什么 - 使用示例 1 中的超时或检查回调函数中的相等性(例如示例 2)?
EXAMPLE1:
getAllFiles: function () {
var def = $.Deferred();
var files = [];
fileEntries.forEach(function(fileEntry){
fileEntry.file(function (file) {
var reader = new FileReader();
reader.onload = function (e) {
files.push({
name: fileEntry.fullPath,
content: e.target.result
});
};
reader.readAsArrayBuffer(file);
});
});
//this resolves the deffered
var interval = setInterval(function(){
if (files.length === fileEntries.length) {
def.resolve(files);
clearInterval(interval);
}
}, 1000);
return def.promise();
}
示例 2
getAllFiles: function () {
var def = $.Deferred();
var files = [];
fileEntries.forEach(function(fileEntry){
fileEntry.file(function (file) {
var reader = new FileReader();
reader.onload = function (e) {
files.push({
name: fileEntry.fullPath,
content: e.target.result
});
//this resolves the deffered
if (files.length === fileEntries.length) {
def.resolve(files);
clearInterval(interval);
}
};
reader.readAsArrayBuffer(file);
});
});
return def.promise();
}
【问题讨论】:
-
看起来您正在使用 jQuery,这意味着您可以利用
$.when。 -
@zzzzBov,我不明白在这里如何使用 jQuery。各位大神能否举个具体的例子来说明我的情况?对于用户
when异步方法应该返回承诺,但file方法和onload都不返回承诺。 -
您的第二个示例不正确,因为您不止一次地解决了延迟问题(实际上是在每个循环迭代中)。根据您的要求,计时器可能不够可靠。您是否尝试过维护一个计数器,并且仅在读取最后一个文件时才解决延迟问题?
标签: javascript