2017-11-06 12 views
0

こんにちは、約束したループで約束を使う正しい方法

私はノードプロジェクトの初期化にPromiseを使用します。

gitリポジトリのすべてのブランチにファイルの名前をMongoDbに挿入したいとします。

私はrepoを操作するためにnodegitを使用していますが、すべてのnodegitメソッドでプロミスが返されます。しかし、私はすべてのファイルとブランチ名を取得するために、すべてのブランチリファレンスをループする必要があります。

その後、次の約束事でデータベースに挿入するために配列を準備することができます。

コードのようになります。

// List all branchs 
 
.then((branchs) => { 
 
    let promises = []; 
 
    let allBranchFiles = []; 
 
    branchs.map((branch) => { 
 
    let q = repo.checkoutBranch(branch, config.checkoutOpts) 
 
     .then(() => repo.getCurrentBranch()) 
 
     .then((ref) => { 
 
     return new Promise((resolve, reject) => { 
 
      fs.readdir('./myRepo/', (err, files) => { 
 
      files.map((file) => { 
 
       allBranchFiles.push({fileName: file, branch: branch}); 
 
      }); 
 
      resolve(allBranchFiles); 
 
      }); 
 
     }); 
 
     }); 
 
    promises.push(q); 
 
    }); 
 
    return Promise.all(promises); 
 
})

2つの方法により、そのコードの仕上げ:

  • まず:
    { Error: the index is locked; this might be due to a concurrent or crashed process 
     
        at Error (native) errno: -14 }

私はこのリポジトリにgitを使用しているプロセスはありません。

  • 第二:

私のすべてのファイルは、「ブランチ」に同じ値を取得しますが、彼らは別のbranchsです。

私を助けてくれてありがとう!

Cya。

+0

は、ベストプラクティスのためにその深くネストされた機能を削減してみてください。 –

+0

私は好きですが、私はどのように見ることができません。 Nodegitは非常に制限されています... – fromScratch

+0

これは多くのコードです。期待どおりに動作しない場所に絞り込んでください。 – ktilcu

答えて

0

私は何かを試して、それは仕事ですが、それは醜いです。

私は自分のことをするために再帰関数を使用します。私はその変化のためにより良く待つ。

質問で自分のコードを置き換える方法を教えてください。

// List all branchs 
 
.then((branchs) => { 
 
    return new Promise((resolve, reject) => recursiv(branchs).then(() => resolve(allBranchFiles))); 
 
})

そして、私の機能:

let recursiv = (branchs, index=0) => { 
 
    return new Promise((resolved, rejected) => { 
 
    repo.checkoutBranch(branchs[index], config.checkoutOpts) 
 
     .then(() => repo.getCurrentBranch()) 
 
     .then((user) => { 
 
     return new Promise((resolve, reject) => { 
 
      fs.readdir('./myRepo/', (err, files) => { 
 
      files.map((file) => { 
 
       allBranchFiles.push({fileName: file, branch: branchs[index]}); 
 
      }); 
 
      resolve(); 
 
      }); 
 
     }); 
 
     }) 
 
     .done(() => { 
 
     if (index < branchs.length-1) resolved(recursiv(branchs, index+1)); 
 
     else resolved(); 
 
     }); 
 
    }); 
 
};