Я разрабатываю скрипт PhantomJS для загрузки всех ресурсов веб-сайта и проверки их выполнения сценария bash.Как подождать PhantomJS 'fs.write, чтобы закончить запись
Для этого я написал метод page.onResourceReceived, когда я сохраняю файл с помощью fs.write(), а затем исполняю скрипт bash с помощью execFile().
page.onResourceReceived = function(resource) {
if (resource.stage == 'end') {
fileName = getFileNameFromURL(resource.url);
fs.write('files/' + fileName, resource.body, 'wb');
execFile('sh', [SH_PATH, 'files/' + fileName], null, null);
}
}
(это не весь onResourceReceived код)
Если настроить функцию обратного вызова для ExecFile, он выдает ошибку нет такого файла или каталога, но затем, я проверяю каталог и файл существует ,
Я думаю, что это может быть проблема синхронизации.
Является ли fs.write асинхронным методом?
Есть ли альтернатива синхронному выполнению методов fs.write и execFile?
Update
Я также попытался это:
function waitForFile(filePath, attempts) {
var fileExists = false;
var i = 0;
while (!fileExists && i < attempts) {
wait(50);
fileExists = fs.exists(filePath) && fs.isFile(filePath) && fs.size(filePath) > 0;
i++;
}
}
page.onResourceReceived = function(resource) {
if (resource.stage == 'end') {
fileName = getFileNameFromURL(resource.url);
fs.write('files/' + fileName, resource.body, 'wb');
waitForFile('files/' + fileName, 5);
execFile('sh', [SH_PATH, 'files/' + fileName], null, null);
}
}
Где ждать() является функцией, которая держит нить занят в течение X миллисекунд.
Благодарим вас за ответ. Я попробовал, но даже с задержкой, есть несколько ресурсов, которые не работают при выполнении сценария bash. Я попробую еще раз с большей задержкой, но я думаю, что должно быть лучшее исправление. –
Тайм-ауты не являются эффективным способом достижения синхронизации/заказа в асинхронных вызовах и являются плохой практикой. – AxxE