2016-04-19 2 views
1

Я создал сценарий nodejs для загрузки файлов css в наше веб-приложение. Я пропустил все, что не нужно:Преобразование обратных вызовов в обещания в nodejs

var downloadCSS = function() { 
    var download = wget.download(src, output, options); 
    download.on('end', function(outputMessage) { 
    var unzipStream = fs.createReadStream(output).pipe(unzip.Extract({ path: path })); 
    unzipStream.on('close', function() { 
     findFilesAsync(path); 
    }); 
    }); 
} 

var findFilesAsync = function(path) { 
    for (var vendor in searchList) { 
    (function(filePath, vendor, loginCredentials){ 
     glob(filePath, function(err, files) { 
     login(loginCredentials, files[0], vendor); 
     }) 
    })(filePath, vendor, loginCredentials); 
    } 
}; 

var login = function(credentials, file_local, vendor) { 
    request.post(
    'https://server', 
    function(error, response, body) { 
     getSettings(cookie, file_local, vendor); 
    } 
); 
}; 

var getSettings = function(cookie, file_local, vendor) { 
    request.get(
    'https://server', 
    function(error, response, body) { 
     fileUpload(cookie, settings, file_local, vendor); 
    } 
); 
}; 

var fileUpload = function(cookie, settings, file_local, vendor) { 
    var CSS_file = fs.createReadStream(file_local); 

    CSS_file.on('error', function(err) { 
    console.log('error at reading CSS file'); 
    }); 

    request.post(
    'https://server', 
    function(error, response, body) { 
     setSettings(cookie, settings, vendor); 
    } 
); 
}; 

var setSettings = function(cookie, settings, vendor) { 
    request.put(
    'https://server', 
    function(error, response, body) { 
     logout(cookie, settings, vendor); 
    } 
); 
}; 

var logout = function(cookie, settings, vendor) { 
    request.get(
    'https://server', 
    function(error, response, body) { 
    } 
); 
}; 

Чтобы загрузить файл CSS функции дозвонились сверху вниз, если нет никакой ошибки:

downloadCSS() 
findFilesAsync() 
login() 
getSettings() 
fileUpload() 
setSettings() 
logout() 

Есть 5 CSS файлы, так что всякий раз, когда файл находится в функции findFilesAsync(), новая функция login() будет вызываться асинхронно.

Я знаю, что это может быть сделано с обещаниями, но я не знаю с чего начать?

+2

FWIW, не все согласны с тем, что все чище с обещаниями. Я на самом деле большой поклонник async.js для тех вещей, о которых вы говорите. – Paul

+0

Вы посмотрели [Как преобразовать существующий API обратного вызова в обещания?] (Http://stackoverflow.com/q/22519784/1048572). Попробуйте что-нибудь. – Bergi

ответ

0

Взгляните на это MDN Promise reference, они дали хорошую функцию примера для запросов HTTP, которые используют обещания. Поэтому, чтобы избежать обратных вызовов, вам придется изменить/изменить свой request класс

Смежные вопросы