ошибка в том что вы забыли что nodejs асинхронен и nightmare не ждет пока файл сохранится, сразу переходит на другой адрес, а с таким кодом и правда нетрудно сойти с ума :)
на похожей задаче я использовал async/await:
var Nightmare = require('nightmare');
var browser = Nightmare();
async function login() {
// заходим
}
async function getLinks() {
var result = [];
// вытаскиваем ссылки
await browser
.goto('url')
...
.then(function(data){
result = data.slice();
});
return result
}
async function savePDF(url) {
// сохраняем
await browser
.goto(url)
.pdf(...);
}
async function run() {
await login();
var links = await getLinks();
for (var i=0; i<links .length: i++) {
await savePDF(links[i]);
}
}
await дает сигнал движку чтобы он ждал окончания выполнения и не двигался дальше.
async указывает что функция асинхронная, и только функции с async могут использовать await