Правильный способ использовать обещание в обещанном цикле
Привет,
Я использую Promise для инициализации проекта узла.
Я хочу вставить в мой MongoDb имена файлов на всех моих ветках в моем репозитории git.
Я использую 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);
})
Этот код заканчивается двумя способами:
- Первый:
{ Error: the index is locked; this might be due to a concurrent or crashed process at Error (native) errno: -14 }
Я уверен, что никакой другой процесс не использует git в этом репо!
- Второе:
Все мои файлы имеют одинаковое значение для "ветки", но они находятся в разных ветках.
Спасибо за помощь, ребята!
Cya.
1 ответ
Я пытаюсь что-то, и это работает, но это некрасиво.
Я имею в виду, я использую рекурсивную функцию для выполнения своих вещей. Я лучше подожду перемен, что.
Я дам вам знать, как я заменяю свой код в вопросе.
// 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();
});
});
};