2017-04-05 16 views
0

私は複数の画像を取得するために必要な画像テーブルを持っています。私はこれを行う簡単な方法を理解することはできません。私は各画像(または画像のセット)の.get promise呼び出しをループする必要があります。ポーチから複数の画像を取得する方法

次のコードは、1つのイメージレコード(実際には複数のイメージを持つことができます)を取得します。

次のコードには、配列の各セルに、このイメージセットに追加されたIDと添付ファイルのリスト(コンマで区切られた、したがって分割)の文字列が含まれています。 s [0]はイメージIDで、 ".get"に送信され、返された画像レコードを取得し、各イメージを分離して別の場所で使用するものです。

私は実際にそれをチェーンすることができません。私は何回呼び出しをしなければならないか分かりませんし、呼び出しをループに入れるのは明らかに行かない方法です。

これらのIDをPromise.allまたはPromise.foreachで使用する方法はありますか?

この例では、私は約束またはnullを返しています(私はPromise.resolve(null)を行うべきだと言われました)。サンプルは別のパウチコールから ".then"で始まります。

if (insertedImages != "") { 
     s = insertedImages[0].split(","); 
     return DB_TaskImages.get(s[0], { attachments: true }); 
    } 
    else { 
     return; 
    } 
}).then(function (doc) { 
    if (doc != null) { 

     iTemp = 0; 

ありがとうございます。ここで

は私が

 var insertedImages = []; 

    DB_WorkIssues.allDocs({ include_docs: true, descending: false }).then(function (response) { 

     data = response.rows; 
     imageKtr = 0; 

     for (var i = 0; i < response.total_rows; i++) { 
      if (data[i].doc.IsAttachmentInserted) { 
       DirtyFlag = true; 
       if (data[i].doc.IsAttachmentInserted) { 
       insertedImages[imageKtr++] = data[i].doc._id + "," + data[i].doc.IsAttachmentInserted; 
       } 
       updated[iTemp++] = data[i]; 
      } 
     } 

     if (updated.length > 0) { 
      CTL_HiddenJsonWorkIssues.val(JSON.stringify(updated)); 
     } 

     // Handle images - only handling the 1st image record here 

     if (insertedImages != "") { 
      s = insertedImages[0].split(","); 
      return DB_TaskImages.get(s[0], { attachments: true }); 
     } 
     else { 
      return; 
     } 
    }).then(function (doc) { 
     if (doc != null) { 

      iTemp = 0; 

      for (var key in doc._attachments) { 
       if (iTemp > 0) { 
       attachments[iTemp] = new Array(); 
       } 
       attachments[iTemp][0] = key; 
       attachments[iTemp++][1] = doc._attachments[key]; 
      } 
     } 
     if (iTemp > 0) { 
      if (attachments[0].length > 0) { 
       CTL_HiddenJsonImages.val(JSON.stringify(attachments)); 
      } 
     } 
    }).then(function() { 

これは、単一の画像罰金を扱うが、私はそれが画像を取得するコードのような何かをするように変更されるだろう倍数を、処理する必要がで働いていたコードのセクションです.getは以下のthenableにドキュメント(添付ファイルレコードを)渡しする場所以下:

 // insertedImages would be an array of something like: "819218,fighterjet.jpg, lions.jpg" 
     // where 819218 is the key for the image record and then a list of images. 

     var s; 

     if (insertedImages != "") { 
      for (var i = 0; i < insertedImages.length;i++) { 
       s = insertedImages[i].split(","); 
       return DB_TaskImages.get(s[0], { attachments: true }); 
      } 
     } 
私は多分私は配列にして何とかすべて「[0] s」を移動する何かを考えていた

それをプロミスで使ってください彼はすべて機能します。どのようにそれを行うか分からない。

+0

それは場合、あなたドンだ場合 'サンプルは、別のポーチcall.'から「.then」で始まり'.then'は常に返される値の約束を返します。返された値が返される場合、返す値は返されます。返り値が返される場合、返す値は返されます。 –

+0

' '' x = Promise.resolve() 'を設定すると、ループの各反復で' x = x 'が設定されます。次に、(()=>約束を返す何か...チェーンができる任意の長さである –

+0

私はDB_TaskImages.get()を返すか、何も返さないと言っていますか?だから私はちょうどelse/returnを取るべきですか?私はいつも何かを返さなければならないと思った。 – tshad

答えて

0

db.allDocs({keys: …})を使用すると、複数のドキュメントを一度に取得できます。ユースケースとドキュメント構造によっては、添付ファイル付きのドキュメントだけを表示する小さなビューを作成する方が簡単かもしれません。

以下、db.allDocsを使用しました。私はあなたのコードをもう少し機能的なスタイルに書き直しました。これはコードを単純化するかもしれません。

DB_WorkIssues.allDocs({ include_docs: true, descending: false }).then(function (response) { 

    // We only need the `doc` property from each row, so we map the docs functionally. 
    var docs = response.rows.map(function (row) { return row.doc; }); 
    // Filter to docs with images. 
    var docsWithImages = docs.filter(function (doc) { return doc.IsAttachmentInserted; }); 

    if (docsWithImages.length) { 
     // I don't know what this does, so I left it here. Side effect? 
     CTL_HiddenJsonWorkIssues.val(JSON.stringify(updated)); 

     // Depending on how many documents you have and how large they are, 
     // it might be a good strategy to fetch the images in multiple batches. 
     // Then you should use Promise.all(). 
     var keys = docsWithImages.map(function(doc) { return doc._id; }); 
     return DB_TaskImages.allDocs({ keys: keys, include_docs: true, attachments: true }); 
    } 

    // Return an empty response if there are no images. 
    return {}; 
}).then(function (imagesResponse) { 
    var attachmentObjects = imagesResponse.rows 
    // Map the rows to the documents. 
    .map(function(row) { return row.doc; }) 
    // Make sure there are only documents with attachments. This shouldn't be necessary if the flag `IsAttachmentInserted` is always consistent with the _attachments property, but let's make extra sure. 
     .filter(function (doc) { return !!doc._attachments; }) 
     .map(function (doc) { return doc._attachments }); 

    // Extract the attachments as array. I'd say that another structure would be easier to read and process, but as your function ends there, I can't say for sure. 
    var attachments = attachmentObjects.reduce(function (list, attachmentObject) { 
     for (var key in attachmentObject) { 
     list.push([key, attachmentObject[key]); 
     } 
     return list; 
    }, []); 
    return attachments; 
    }).then(function() { 
    … 

楽しみのためだけに、これはそれほど冗長であるES2016バージョン、次のとおりです。

DB_WorkIssues.allDocs({ include_docs: true, descending: false }).then(({rows}) => { 
    const docsWithImages = rows 
    .map(({doc}) => doc) 
    .filter(({IsAttachmentInserted}) => IsAttachmentInserted); 

    if (docsWithImages.length) { 
    CTL_HiddenJsonWorkIssues.val(JSON.stringify(updated)); 
    return DB_TaskImages.allDocs({ keys: docsWithImages.map(({_id}) => _id), include_docs: true, attachments: true }); 
    } 
    return {}; 
}).then(({rows}) => 
    rows.map(({doc: {_attachments}) => _attachments) 
    .filter(att => att) 
    .reduce((list, attachmentObject) => { 
    for (var key in attachmentObject) { 
     list.push([key, attachmentObject[key]); 
    } 
    return list; 
    }, []) 
    }).then(function() { 
    … 
+0

それは素晴らしいです。私はこれらの例からより良い理解を持っています。 2つの質問:1. alldocs呼び出しで使用するキーのconstを使用する。あなたはそれをvarに使った理由は何ですか? 2.キー配列を使用してPromise.allへの呼び出しをどのように設定しますか?ありがとう、 – tshad

+0

また、あなたはJSON.stringifyについて言及しました。これはMVCアプリケーションであり、JavaScriptからC#にデータを戻す必要があります。この処理は文字列で行います。そこで、C#アプリケーションにjson文字列を送って、画像を取得してサーバーに移動します。 – tshad

+0

最後に1つ。 imagesResponseをattachments配列に減らすと、それはうまくいきます。ただし、imagesResponse内の添付ファイルレコードの元の値は失われます。あなたがしたテクニックにそれを追加する簡単な方法はありますか?縮小せずにimagesResponseを使って手作業で配列を作成することでできますが、もっと良い方法があればそれを使いたいと思います。ありがとう。 – tshad

関連する問題