Javascript 如何使用jQuery对异步操作排序?
我使用的是jQuery v2.1.4,我有以下功能,对于Javascript 如何使用jQuery对异步操作排序?,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,我使用的是jQuery v2.1.4,我有以下功能,对于evt.data.files中的每个对象(数组中的元素数量会有所不同),需要向服务器发出请求 这个脚本面临的问题是,对于evt.data.files中的每个元素,都会发出异步请求,而我需要: 按顺序执行每个请求(如果可能,使用jQuery) 当所有请求都成功返回时,调用单个方法 您能给我推荐一个带有示例的解决方案吗?谢谢 options.onInit = function (finder) { finder.on('files:
evt.data.files
中的每个对象(数组中的元素数量会有所不同),需要向服务器发出请求
这个脚本面临的问题是,对于evt.data.files
中的每个元素,都会发出异步请求,而我需要:
- 按
顺序执行每个请求(如果可能,使用jQuery)
- 当
所有请求都成功返回时,调用单个方法
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);
我意识到我第一次误解了这个问题。您只需按顺序运行请求并等待最后一个请求: 使用
promise=promise。然后(newPromise)
按顺序链接承诺:
例如
这里的关键功能是在每次
调用中返回匿名函数中的承诺,然后再调用。这会推迟执行,直到前一个承诺得到解决,但仍然会约束承诺 我意识到我第一次误解了这个问题。您只需按顺序运行请求并等待最后一个请求:
使用promise=promise。然后(newPromise)
按顺序链接承诺:
例如
这里的关键功能是在每次调用中返回匿名函数中的承诺,然后再调用。这会推迟执行,直到前一个承诺得到解决,但仍然会约束承诺 您可以链接.done事件。切换到基于承诺的代码模型。然后,您可以使用.then()
进行序列操作,使用$。when()
进行并行操作(如“全部完成”)。感谢您的评论,我进行了编辑,我理解您的观点,但evt.data.files中的元素数是variable@GoneCodingGoodbye如何将承诺(在forEach中动态创建)传递到$.when(),感谢您的评论。也许您可以尝试以下方式:您可以链接您的.done事件。切换到基于承诺的代码模型。然后,您可以使用.then()
进行序列操作,使用$。when()
进行并行操作(如“全部完成”)。感谢您的评论,我进行了编辑,我理解您的观点,但evt.data.files中的元素数是variable@GoneCodingGoodbye如何将承诺(在forEach中动态创建)传递到$.when(),谢谢你们的评论。也许你们可以尝试这样的方式:请各位,在投票时添加评论。顺便说一下,这个答案解决了我的问题。谢谢你在这方面花时间!请各位在投票时加上评论。顺便说一下,这个答案解决了我的问题。谢谢你在这方面花时间!
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);