2017-06-04 6 views
0

Hintergrund:aktualisieren mehr als ein Dokument in einer Schleife

Ich benutze PouchDB (IndexedDB) für eine Offline-NW.js App und ich bin neu in No-SQL. Ich benutze auch das PouchDB Plugin Upsert, das tut im Hintergrund eine db.get() und db.put().

Problem:
I dynamisch n Dokumente erstellen und in einer anderen Funktion möchte ich sie alle mit der Upsert Funktion in einer Schleife aktualisieren, aber ich muss Rückkehr das Dokument, das ich aktualisieren möchten. Also stoppt die Schleife beim ersten Lauf (logisch, nur normales Verhalten).

Gibt es eine Möglichkeit, n Dokumente mit einer Funktion in einer Schleife zu aktualisieren?

Hier ist mein Codebeispiel:

var temp = $('#number_discuss_points').val(); 

for (i = 1; i < temp; i++) { 
    var v1= $('#discusspoint_heading' + i).val(); 
    var v2= $('#discusspoint_subheading' + i).val(); 
    var v3= $('#point_number' + i).val(); 
    var v4= $('#dpoint_deadline' + i).val(); 
    var v5= $('#responsible_person' + i).val(); 
    var v6= $('#dp_text' + i).val(); 

    db.upsert(id_body + i, function (sheet) { 
     sheet._id = id_body + i; 
     sheet.discusspoint_heading = v1; 
     sheet.discusspoint_subheading = v2; 
     sheet.point_number = v3; 
     sheet.dpoint_deadline = v4; 
     sheet.responsible_person = v5; 
     sheet.dp_text = v6; 

     return sheet; //Logically, the functions stops here and return everthing with 1 

    }).then(function (result) { 
     console.log(result); 
    }).catch(function (err) { 
     console.log(err); 
    }); 
} 

Antwort

0

denke ich Nolan Lawson in Kürze zusammen mit einer viel besseren Antwort als ich sein, aber hier geht sowieso ... in der Schleife können Sie jedes Versprechen von db zurück hinzufügen .upsert in ein Array. Nach der Schleife können Sie Promise.all verwenden, um alle Versprechungen wie diese zu verarbeiten:

var temp = $('#number_discuss_points').val(); 

var promise_list = []; 

for (i = 1; i < temp; i++) { 
    var v1= $('#discusspoint_heading' + i).val(); 
    var v2= $('#discusspoint_subheading' + i).val(); 
    var v3= $('#point_number' + i).val(); 
    var v4= $('#dpoint_deadline' + i).val(); 
    var v5= $('#responsible_person' + i).val(); 
    var v6= $('#dp_text' + i).val(); 

    promise_list.push(db.upsert(id_body + i, function (sheet) { 
     sheet._id = id_body + i; 
     sheet.discusspoint_heading = v1; 
     sheet.discusspoint_subheading = v2; 
     sheet.point_number = v3; 
     sheet.dpoint_deadline = v4; 
     sheet.responsible_person = v5; 
     sheet.dp_text = v6; 

     return sheet; //Logically, the functions stops here and return everthing with 1 
    })); 
} 

Promise.all(promise_list).then(function (result_list) { 
    for(var result in result_list) { 
     console.log(result); 
    } 
    }).catch(function (err) { 
     console.log(err); 
    }); 

Nolan in seinem Beitrag „We have a problem with promises“ sehr gut abdeckt.

+0

Thank you! Ich habe es noch nicht vollständig gemacht, aber dies ist ein Schritt in die richtige Richtung. –

+0

Alternativ könnten Sie die Dokumente in der 'for-Schleife' generieren und eine einzige 'db.bulkdocs()' -Operation verwenden, die effizienter wäre. Dies setzt jedoch voraus, dass Sie die vorhandenen doc _rev-Daten bereits weitergeben oder die neuen Dokumente nicht bereits vorhanden sind. Allerdings ist die obige 'db.upsert()' Lösung robuster, da sie dies für uns erledigt. –

+0

Das ist ein guter Hinweis. Ich werde es später versuchen. –

0

Erstes eine Reihe von docs innerhalb einer for-Schleife erstellen:

docArray=[] 

for(i=1;i<10;i++){ 
    /* Create doc */ 
    doc={} 
    doc._id=i 
    doc.whatever='The Power of '+ i 
    /* Push doc to array */ 
    docArray.push(doc) 
} 

nun die docArray zu einer verketteten Versprechen reduzieren:

docArray.reduce((seq,doc)=>{ 
    return seq.then(()=>{ 
     /*Chain "db.pusert" promise to seq*/ 
     return db.upsert(doc._id,function(docOLD){return doc}) 
    }); 
},Promise.resolve()/* Initial value of seq */) 
.then(res=>{console.log('All "db.upserts" resolved')}) 
.catch(err=>{throw new Error(err)}) 
Verwandte Themen