我正在使用jQuery v2.1.4,我有以下函数,对于evt.data.files
中的每个对象(数组中的元素数量会有所不同)需要向服务器发出请求。
我在这个脚本中面临的问题是,evt.data.files
中的每个元素都会产生异步请求,而我需要:
sequence
中的每个请求(如果可能,使用jQuery)all
请求时调用单个方法。您能否建议我使用示例的解决方案?感谢。
options.onInit = function (finder) {
finder.on('files:choose', function (evt) {
// files is an array of n object
evt.data.files.forEach(function (file) {
// req is an jquery deferred object
var req = finder.request('command:send', {
name: 'ImageInfo',
folder: file.get('folder'),
params: { fileName: file.get('name') }
}).done(function (response) {
if (response.error) {
return;
}
});
});
});
}.bind(this);
答案 0 :(得分:2)
我意识到我第一次误读了这个问题。您只需要按顺序运行请求并等待最后一个:
使用promise = promise.then(newPromise)
按顺序链接承诺:
options.onInit = function (finder) {
finder.on('files:choose', function (evt) {
var promise = $.when(); // start with a resolved promise
// files is an array of n object
evt.data.files.forEach(function (file) {
promise = promise.then(function(){
return finder.request('command:send', {
name: 'ImageInfo',
folder: file.get('folder'),
params: { fileName: file.get('name') }
});
});
});
promise.then(function(){
alert("Last one done");
});
});
}.bind(this);
此处的关键功能是在每个then
调用中返回匿名函数中的promise 。这推迟了执行,直到前一个承诺结算,但仍然链接承诺。