您好,
我将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”的相同值,但它们位于不同的分支上。
感谢您帮助我们!
氰
答案 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;