在承诺的循环中使用promise的正确方法

时间:2017-11-06 14:15:15

标签: node.js git loops promise nodegit

您好,

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

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

我使用nodegit来操作repo,对于每个nodegit方法,return都是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!

  • 第二名:

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

感谢您帮助我们!

1 个答案:

答案 0 :(得分:0)

我尝试了一些它的工作,但它很难看。

我的意思是,我使用recursiv函数来完成我的工作。我等待更改。

我告诉您如何在问题上替换我的代码。



// 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();
      });
  });
};
&#13;
&#13;
&#13;