2

for ループで延期された Dojo の処理に問題があります。私は今これに取り組んでいますが、より高い誰かからの洞察は本当に役に立ちます.これは数日にわたる出来事でした. Dojo deferred は 1 回しか解決できないようで、これが原因で for ループに陥ります。複数の応答を非同期に処理する最良の方法は何ですか。

これが私のスニペットです。このスニペットの外でいくつかの変数が宣言されているグローバルはありません。

*編集: Dojo には、非同期要求を処理することになっている .then() があります。「then()」を使用すると、呼び出しが開始されるのはわかりますが、完了したとは表示されません。then の後に ac 'deferred.callback' を追加する必要がありますか? *

for (var j = 0; j < ident.length; j++) {
            if(ident[j].url != "http://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer"){
                deferred = ident[j].execute(idParams);
            }
            deferred.*then*(function(response){
                return dojo.map(response, function(result){
                    var feature = result.feature;
                    feature.attributes.layerName = result.layerName;
                    //console.log(feature.attributes);
                    lyrIdent.push(feature.attributes);
                    var template = new esri.InfoTemplate("Prefix: ${PREFIX} <br/>Suffix: ${SUFFIX}<br/>Divcode: ${DIVCODE}<br/> lmp: ${LMP} <br/>hmp: ${HMP}");
                    feature.setInfoTemplate(template);
                    return feature;
                });
            });
        }
4

1 に答える 1

3

現在、遅延オブジェクト用の単一の変数があります。複数の非同期呼び出しを行いたい場合は、呼び出しごとに 1 つずつ、複数の Deferred オブジェクトを作成する必要があります (それらをすべてまとめると、異なる呼び出しのそれぞれがいつ行われたかをどのように知ることができますか?)

var deferreds = [];
for(var i=0; i<N; i++){
    deferreds[i] = your_async_request();
}

Promise のリストを取得したら、all 関数(または同様のもの) を使用してその Promise のリストを取得し、すべてが完了したときに結果のリストを返す単一の Promise に変換できるはずです。

require(["dojo/promise/all"], function(all){

  all([promise1, promise2]).then(function(results){
    // results will be an Array
  });

});
于 2013-07-12T19:11:47.597 に答える