Mam następujący kod

    $.when(tableInsert("index.php/get/sync/riesgos", insert_riesgo, evalua.webdb.db, callback)).then(function(){
        update_records("riesgos");
        $.when(tableInsert("index.php/get/sync/estancias", insert_estancia, evalua.webdb.db, callback)).then(function(){
            update_records("estancias");
            $.when(tableInsert("index.php/get/sync/riesgosestancias", insert_riesgoestancia, evalua.webdb.db, callback)).then(function(){
                update_records("riesgosestancias");
            });
        });
    });

Próbuję znaleźć jak zintegrować go w pętli lub pętli $. Beach, aby czeka, aż obietnica zostanie wykonana przed następną iteracją. Na początku wygląda na to, że trzy połączenia byłyby łatwiejsze do zagnieżdżenia, ale jest to tylko kawałek kodu, zagnieżdżone połączenia liczyć 15 teraz!

1
manutenfruits 3 październik 2012, 10:53

3 odpowiedzi

Najlepsza odpowiedź

Cóż, najpierw potrzebujesz tablicy z danymi, na przykład:

var calls = [
    {
        url: "index.php/get/sync/riesgos",
        func: insert_riesgo,
        update: "riesgos"
    },
    ...
];

A następnie możesz mieszać połączenia za pomocą .pipe [Doksy] :

var def = (new $.Deferred()).resolve();

$.each(calls, function(call) {
    def = def.pipe(function() {
        return tableInsert(call.url, call.func, evalua.webdb.db, callback).done(function() {
            update_records(call.update);
        ]);
    });
});

W twoim przykładzie nie ma potrzeby $.when.

5
Felix Kling 3 październik 2012, 07:09

Myślałem przed zobaczeniem swojej odpowiedzi, @ Felix-Kling i przyszedł do podobnego podejścia:

Utwórz tablicę:

webdb.tables=[{
    name: "riesgos",
    callback: insert_riesgo,
},{
    name: "estancias",
    callback: insert_estancia,
},{
    name: "riesgosestancias",
    callback: insert_riesgoestancia,
}];

I za pomocą pętli funkcji rekurencyjnej przez niego:

var i=0;
    function recursive(){
        $.when(tableInsert("index.php/get/sync/"+webdb.tables[i].name, webdb.tables[i].callback, webdb.db, callback)).then(function(){
            update_records(webdb.tables[i].name);
            if(++i<webdb.tables.length)
                recursive();
        });
    }
0
manutenfruits 3 październik 2012, 07:15

Jeśli jesteś w całym asynowym Deferred rzecz:

var arr = [
  ["index.php/get/sync/riesgos", insert_riesgo, "riesgos"],
  ["index.php/get/sync/estancias", insert_estancia, "estancias"],
  ["index.php/get/sync/riesgosestancias", insert_riesgoestancia, "riesgosestancias"]
];

var dfd = $.Deferred().resolve();

$.each(arr, function(i, item) {
  dfd.then(function() {
    return $.when(tableInsert(item[0], item[1], evalua.webdb.db, callback)
    .then(function() {
      update_records(item[2]);
    });
  })
});
0
Kernel James 3 październik 2012, 07:46