2016-10-04 2 views
0

Я использую код node.js для создания функции для загрузки изображения из репозитория и последующей загрузки в репозиторий B. Я хочу, чтобы все потоки завершились до того, как они будут продолжены с другими задачами. Я пробовал этот путь, но я не добился успеха. Пример: Когда я запустил его, он будет работать в getImage. Когда getImage не завершен, он будет проходить через A-> B-> C до тех пор, пока он не будет завершен, а затем он завершит getImage. Как я могу принудительно завершить все потоки до того, как они будут продолжены с другими задачами? Я хочу сказать, что getImage будет закончен перед запуском A-> B-> C.Как заставить весь поток сделать, прежде чем мы продолжим с другой задачей?

PS: Я использую pkgCloud для загрузки изображения в хранилище IBM Object Storage.

function parseImage(imgUrl){ 
    var loopCondition = true; 
    while(loopCondition){ 
     getImages(imgUrl,imgName); 
     Do task A 
     Do task B 
     Do task C 
    } 
}  

function getImages(imgUrl, imgName) { 
    //Download image from A repository 
    const https = require('https'); 
    var imgSrc; 
    var downloadStream = https.get(imgUrl, function (response) { 

     // Upload image to B repository. 
     var uploadStream = storageClient.upload({container: 'images', remote: imgName}); 
     uploadStream.on('error', function (error) { 
     console.log(error); 
     }); 
     uploadStream.on('success', function (file) { 

     console.log("upload Stream>>>>>>>>>>>>>>>>>Done"); 
     console.log(file.toJSON()); 
     imgSrc = "https://..."; 
     }); 
     response.pipe(uploadStream); 
    }); 
    downloadStream.on('error', function (error) { 
     console.log(error); 
    }); 
    downloadStream.on('finish', function() { 
     console.log("download Stream>>>>>>>>>>>>>>>>>Done"); 
    }); 
    return imgSrc; 
    } 
+0

Какая функция определяет 'imgSrc'? 'uploadStream.on ('success''? – guest271314

+0

См. [В чем разница между синхронным и асинхронным программированием (в узле.js)] (http://stackoverflow.com/questions/16336367/what-is-the-difference- между-синхронно-асинхронным программированием-в-узле) – guest271314

ответ

0

Вы должны понимать разницу между функцией синхронизации и асинхронной работы. Функция getImages выполняет асинхронный код, поэтому, если вы хотите использовать результаты этой функции, вам необходимо передать обратный вызов, который будет вызываться, когда потоковая передача завершится. Что-то вроде этого:

function parseImage(imgUrl) { 
    getImages(imgUrl, imgName, function (err, imgSrc) { 
     if (imgSrc) { 
     Do task A 
     } else { 
     Do task B 
     } 
    }); 
    } 

    function getImages(imgUrl, imgName, callback) { 
    //Download image from A repository 
    const https = require('https'); 
    var imgSrc; 

    var downloadStream = https.get(imgUrl, function (response) { 
     // Upload image to B repository. 
     var uploadStream = storageClient.upload({ container: 'images', remote: imgName }); 
     uploadStream.on('error', function (error) { 
     console.log(error); 
     return callback(error); 
     }); 

     uploadStream.on('success', function (file) { 
     console.log("upload Stream>>>>>>>>>>>>>>>>>Done"); 
     console.log(file.toJSON()); 
     imgSrc = "https://..."; 

     return callback(null, imgSrc); 
     }); 

     response.pipe(uploadStream); 
    }); 

    downloadStream.on('error', function (error) { 
     console.log(error); 
     return callback(error); 
    }); 

    downloadStream.on('finish', function() { 
     console.log("download Stream>>>>>>>>>>>>>>>>>Done"); 
    }); 
    } 
+0

Спасибо, теперь я понимаю об Async и Sync. но с моим выше кодом. Как я могу заставить код ждать завершения функции getImage, прежде чем начать выполнять другую задачу? –

+0

@ ThuậnLê Я уже реорганизовал ваш код, передавая обратный вызов, будет делать трюк. –

+0

Прошу прощения за неправильную информацию. Потому что у меня есть цикл while выше, поэтому при запуске он будет работать до конца, а затем вернуться, чтобы запустить getImage функция –

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