0

你好,

我将 Promise 用于初始化节点项目。

我想在我的 MongoDb 中插入我的 git 存储库上所有分支上的文件名。

我使用 nodegit 来操作 repo,对于每个 nodegit 方法,返回都是一个 Promise。但我需要循环所有分支引用以获取所有文件和分支名称。

之后,我可以准备我的数组以在下一个承诺中插入数据库。

代码如下:

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

该代码通过两种方式完成:

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

我确信在这个 repo 中没有其他进程使用 git!

  • 第二 :

我的所有文件都为“分支”获得相同的值,但它们位于不同的分支上。

谢谢你们帮助我!

赛亚。

4

1 回答 1

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

于 2017-11-07T11:07:34.400 回答