NodeJS, добавление действий в цикл Promise в то время как - PullRequest
0 голосов
/ 26 января 2020

, поэтому я довольно новичок в использовании Обещаний в NodeJS. Я пытаюсь динамически создать обещание с несколькими действиями в зависимости от символов в строке.

//let actions = [];
getPromise = get(srcBucket, srcKey); // Get the image

//Apply transformations to image.
while (transformations.length > 0) {
  let op = transformations.charAt(0);
  if (op == 'B') {
    getPromise.then(image => blur(image));
  } else if (op == 'R') {
    getPromise.then(image => resize(image));
  } else if (op == 'O') {
    getPromise.then(image => rotate(image));
  } else if (op == 'S') {
    getPromise.then(image => sepia(image));
  } else if (op == 'C') {
    getPromise.then(image => compress(image));
  }
  transformations = transformations.substring(1);
}

getPromise.then(modified => put(destBucket, destKey, modified))
  .then(() => putSAAFOutput(inspector))
  .then(() => {
  console.log('Success');
  return resolve('Success');
})
.catch(error => {
  console.error(error);
  return reject(error);
});

Метод get в первой строке получает изображение из Amazon S3. Затем я хочу сделать несколько преобразований для этого изображения на основе символов в строке «преобразования». Каждая из функций преобразования (размытие, изменение размера, сепия и т. Д. c) все возвращает свои собственные обещания.

Когда я запускаю эту функцию, ни одно из преобразований не применяется к изображению! Любая помощь будет очень признательна.

Ответы [ 2 ]

1 голос
/ 26 января 2020

Похоже, вы уже видите, что исправление getPromise = getPromise.then(...). Я подумал, что просто добавлю, что этот тип кода выглядит немного чище, если вы DRY создадите справочную таблицу вместо большого if/else и перебираете список символов, накапливающих цепочку обещаний, звучит как работа для .reduce().

let getPromise = get(srcBucket, srcKey); // Get the image

const transformMap = {
    B: blur,
    R: resize,
    O: rotate,
    S: sepia,
    C: compress
};

//Apply transformations to image.
getPromise = transformations.split("").reduce((p, op) => {
    let fn = transformMap[op];
    if (fn) {
        return p.then(image => fn(image));
    } else {
        return p;
    }
}, getPromise);

return getPromise.then(modified => put(destBucket, destKey, modified))
  .then(() => putSAAFOutput(inspector))
  .then(() => {
  console.log('Success');
  return 'Success';
})
.catch(error => {
  console.error(error);
  throw error;
});

Кроме того, тот факт, что вы используете somePromise.then(resolve).catch(reject) в конце цепочки обещаний, по-видимому, означает, что вы завернули все это в свои new Promise(). Делать это - обещание анти-паттерна и не нужно. Вместо этого вы можете просто вернуть обещание, которое у вас уже есть. Вместо resolve('Success'); вы можете просто сделать return 'Success'. И вместо reject(error); вы можете просто сделать throw error.

0 голосов
/ 26 января 2020

То, что вы делаете, потребует от вас цепочки обещаний, возвращаемых на каждом шаге

, поэтому getPromise = getPromise.then( ... do something else and return a promise ...)

является шаблон, который вы хотите

как так

getPromise = get(srcBucket, srcKey); // Get the image

//Apply transformations to image.
while (transformations.length > 0) {
  let op = transformations.charAt(0);
  if (op == 'B') {
    getPromise = getPromise.then(image => blur(image));
  } else if (op == 'R') {
    getPromise = getPromise.then(image => resize(image));
  } else if (op == 'O') {
    getPromise = getPromise.then(image => rotate(image));
  } else if (op == 'S') {
    getPromise = getPromise.then(image => sepia(image));
  } else if (op == 'C') {
    getPromise = getPromise.then(image => compress(image));
  }
  transformations = transformations.substring(1);
}

getPromise.then(modified => put(destBucket, destKey, modified))
  .then(() => putSAAFOutput(inspector))
  .then(() => {
  console.log('Success');
  return resolve('Success');
})
.catch(error => {
  console.error(error);
  return reject(error);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...