javascript - 如何生成结果 Javascript 嵌套延迟

标签 javascript jquery ajax dojo deferred

我正在使用 ESRI Javascript API 检索 ArcGIS Server 中数据集中的所有记录以进行客户端处理。服务器将每个响应限制为 1000 条记录。这意味着我必须在检索特征时跟踪它们,然后检索下一批。对检索记录的 API 的调用会返回一个 dojo/Deferred 对象。

我希望能够检索一批 1000 条记录,对其进行处理,然后将它们全部按顺序保存回数据集。同时,一旦从数据集中检索到一批记录,就会开始检索下一批记录。

我已经使用递归函数调用完成了类似的操作,并将生成的 dojo/Deferred 保存到列表中,以便稍后使用 dojo/promise/all 进行处理。然而,这意味着在检索到所有特征后立即处理所有特征。我宁愿能够在检索每个批处理时单独处理它们。

我的应用程序使用 dojo 以及 ESRI API 和 jQuery/jQuery Mobile。

这是我的代码,它一次返回所有功能:

//layer = dataset (geographic data)
//count = count of records (features) in dataset
//objectIds = list of all unique record ID's in dataset.  This can be retrieved from the server and is not limited by the 1000 record limit
//Query = ESRI API Query Task used to retrieve features from the dataset

if (count > layer.maxRecordCount) {

    var features = [];

    var i = 0;

    var deferreds = [];
    for (i; i < objectIds.length; i += layer.maxRecordCount) {

        var q = new Query();
        q.objectIds = objectIds.slice(i, i + layer.maxRecordCount);

        var deferred;
        if (select) { deferred = layer.selectFeatures(q, selectionType); }
        else { deferred = layer.queryFeatures(q); }

        deferreds.push(deferred);

    }

    var deferred = all(deferreds).then(function(featuresets) {

        var featureLists = array.map(featuresets, function(featureset) {
            return featureset.features || featureset;
        });

        var features = [].concat.apply([], featureLists);

        return features;

    });

    return deferred;

}

更新:

我已经找到了一种方法来使用Array作为队列来完成我想要的任务。

以下是从数据库检索记录的函数:

getAllFeatures : function(layer, returnGeometry, fields) {

    var queue = ["start"];

    var q = new esriQuery();
    q.where = "1=1";

    var qt = new QueryTask(layer.url);

    layer.queryIds(q).then(function(objectIds) {

        var deferreds = [];

        for (var i = 0; i < objectIds.length; i += layer.maxRecordCount) {

            var q = new esriQuery();
            q.objectIds = objectIds.slice(i, i + layer.maxRecordCount);
            q.returnGeometry = !!returnGeometry;
            q.outFields = fields && [layer.objectIdField].concat(fields) || ["*"];

            deferreds.push(qt.execute(q).then(function(featureSet) {
                queue.push(featureSet.features);
            }));

        }

        all(deferreds).then(function() {
            queue.push("stop");
        });

    });

    return queue;

}

这是处理数据的代码:

var queue = pgUtils.getAllFeatures(layer, false, [priorityField.name]);

var features = queue.shift();

var interval;

if (features === "start") {

    interval = setInterval(function() {
        features = queue.shift();
        if (features && features instanceof Array) {
            self._prioritize(features, formData);
            new esriRequest({
                url : layer.url + "/applyEdits",
                content : {
                    f : "json",
                    updates : JSON.stringify(features)
                }
            }, {usePost : true});
        } else if (features === "stop") {
            clearInterval(interval);
        }
    }, 500);
}

如您所见,我使用名为 queueArray 来推送 getAllFeatures 函数中的各个响应,并使用 setInterval 队列检索这些响应,直到找到“stop”信号。到目前为止,这似乎适用于我的 450 条记录的测试数据集。我还不确定这对于更大的数据集如何工作。我绝对愿意接受任何更好方法的建议。

最佳答案

查看 DeferredList。

var def_array = [];
for(..) {
  var def = new Deferred();
   ...
  def_array.push(def);
}
new DeferredList(def_array).then(function(res){
   ...
   //this runs only all the deferreds in the def_array is invoked and completed
});

DeferredList 还有许多其他参数/​​标志,它们根据需求用于特定目的。但是,对于您的情况,我想上述解决方案就足够了。

关于javascript - 如何生成结果 Javascript 嵌套延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20647163/

相关文章:

JavaScript:循环数组

javascript - 无法同时验证表单和调用函数 onclick 提交按钮

javascript - 单击浏览器后退按钮返回到 ajax 页面并使其看起来相同吗?

javascript - 使用 Shift + Tab 为父项时运行 JS

javascript - 使用 .fadeToggle() 淡入文本并在悬停时淡出

javascript - 无法在 IE 11 中通过 FileReader 读取 SQL blob

Javascript 没有 alert() 就不能工作

javascript - filepicker.io 将选项添加到 makedrop Pane

HTML 表格单元格中的 Javascript 函数调用

javascript - 球体表面随机生成 3D 点