Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用jQuery对异步操作排序?_Javascript_Jquery_Asynchronous - Fatal编程技术网

Javascript 如何使用jQuery对异步操作排序?

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:

我使用的是jQuery v2.1.4,我有以下功能,对于
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);