2017-06-04 11 views
0

背景:更新複数のドキュメント

私はオフラインNW.js AppのPouchDB(のIndexedDB)を使用して、私はノー-SQLに新たなんです。私はまた、PouchDBプラグインUpsertを使用しています。これは基本的に、バックグラウンドでdb.get()とdb.put()を実行します。

問題:私は動的にn個文書を作成し、別の関数に私は、ループ内のアップサート機能でそれらすべてを更新したいが、私はリターン私は更新したい文書を持って
。したがって、ループは最初の実行で停止します(論理的には正常な動作)。

n文書を1つの機能でループで更新する方法はありますか?

ここに私のコード例があります:

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); 
    }); 
} 

答えて

0

私はノーランローソンは私よりもはるかに良い答えをすぐに沿ったものになると思うが、ここではとにかく行く...あなたのループの中で、あなたは、DBから各返された約束を追加することができます配列へのアップ。ループの後、あなたは、このようなすべての約束を処理するためにPromise.allを使用することができます。

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); 
    }); 

ノーランは「We have a problem with promises」彼のポストに非常によくこれをカバーしています。 、今

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) 
} 

チェーンの約束にdocArrayを減らす:

+0

ありがとうございます!私はまだ完全にはやっていないが、これは正しい方向への一歩だ。 –

+0

また、 'forループ'でドキュメントを生成し、より効率的な単一の 'db.bulkdocs()'操作を使用することもできます。しかし、これはあなたがすでに渡される既存の文書 '_rev'データを持っているか、または新しい文書がまだ存在していないと仮定しています。しかし、上記の 'db.upsert()'ソリューションは、私たちのためにこれを処理するので、より堅牢です。 –

+0

それは良いヒントです。私は後でそれを試してみる。 –

0

まず、forループ内でのドキュメントの配列を作成

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)}) 
関連する問題