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

时间:2016-02-10 12:31:50

标签: javascript jquery asynchronous

我正在使用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);

1 个答案:

答案 0 :(得分:2)

我意识到我第一次误读了这个问题。您只需要按顺序运行请求并等待最后一个:

使用promise = promise.then(newPromise)按顺序链接承诺:

e.g。

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 。这推迟了执行,直到前一个承诺结算,但仍然链接承诺。