Как заставить весь поток сделать, прежде чем мы продолжим с другой задачей?
Я использую код node.js для создания функции загрузки изображения из репозитория A, а затем загрузки в репозиторий 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;
}
1 ответ
Вы должны понимать разницу между синхронизацией и асинхронной функцией. Функция 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");
});
}