jquery中对于批量deferred的处理方法


在jQuery中,处理批量Deferred对象的一个常用方法是使用`$.when.apply()`。这个方法可以让你同时等待多个Deferred对象解决(resolve)或拒绝(reject),并且可以以数组的形式传递这些Deferred对象。

下面是一个使用`$.when.apply()`来处理批量Deferred对象的示例:


// 假设我们有几个异步操作,它们返回Deferred对象
function asyncOperation1() {
    var deferred = $.Deferred();
    // 假设这里有一些异步逻辑
    setTimeout(function() {
        console.log("操作1完成");
        deferred.resolve("操作1的结果");
    }, 1000);
    return deferred.promise();
}

function asyncOperation2() {
    var deferred = $.Deferred();
    // 假设这里有一些异步逻辑
    setTimeout(function() {
        console.log("操作2完成");
        deferred.resolve("操作2的结果");
    }, 500);
    return deferred.promise();
}

// 创建Deferred对象的数组
var promises = [asyncOperation1(), asyncOperation2()];

// 使用$.when.apply来同时等待所有的promise解决
$.when.apply($, promises).done(function() {
    // 所有的promise都解决时执行的回调
    // 注意:这里this指向undefined,参数是各个promise的解决值
    console.log("所有操作完成");
    console.log(arguments); // 可以通过arguments获取每个异步操作的结果
}).fail(function() {
    // 如果有任何一个promise被拒绝,则执行这个回调
    console.log("有操作失败");
});

在这个示例中,`asyncOperation1()`和`asyncOperation2()`分别代表两个异步操作,它们返回Deferred对象的promise。然后,我们将这些promise收集到一个数组中,并使用`$.when.apply()`来同时等待它们。当所有的promise都解决时,`.done()`中的回调会被执行;如果有任何一个promise被拒绝,`.fail()`中的回调会被执行。

注意,`$.when.apply()`的使用是因为`$.when()`本身不接受数组作为参数,而`apply()`方法允许我们调用一个函数,并且将一个数组作为参数列表传递给它。