Вход в консоль - это то же самое, что разрешается как избыточный? - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть программа, которая заставляет компьютер имитировать несколько дел одновременно, используя асинхронные обещания JavaScript.Я решил начать с малого и сосредоточиться на мытье посуды.По сути, в моем коде есть два файла - библиотека для возврата нового экземпляра объекта Promise и app.js, который вызывает эти функции с .then() и .catch().

Так выглядят функции в library.js.

let washDishes = ({soap}) => {
 return new Promise ((resolve, reject) => {
   setTimeout(() => {
      if (soap) {
        console.log('Status: Clean Dishes'.blue)
        resolve('clean dishes');
      }
      else {
        console.log('Status: Dirty Dishes'.blue);
        reject('dirty dishes');
      }
   }, 1000)
 })
};

let addSoap = () => {
  return new Promise ((resolve) => {
    setTimeout(() => {
      console.log('Status: Soap Added'.blue)
      resolve('soap added');
    }, 1000)
  })
};

let emptyDishwasher = () => {
  return new Promise ((resolve) => {
    setTimeout(() => {
      console.log('Status: Dishwasher Emptied'.blue)
      resolve('dishes put away')
    }, 1000);
  })
}

В приведенном выше сообщении я возвращаю новое обещание, регистрируя состояние и разрешая тот же текст через 1 секунду. Является ли избыточным, чтобы resolv () и console.log () - это одно и то же?Если я не войду, это не покажет, что происходит.

Это основная часть моего app.js кода:

console.log("Doing chores...");

const cleanDishes = washDishes({soap: true})
    .then(function(resolvedValue) { 
        emptyDishwasher(resolvedValue);
    })
    .catch(function(rejectedValue) {
        addSoap(rejectedValue);
    });

Если вы поместите здесь операторы console.log(), вы получите консольную печать

Promise <pending>

Как мне реструктурировать мой код, чтобы остановить эту избыточность, поддерживая тот факт, что я выполняю Обещания?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Вы можете сделать свой код более СУХИМ, выделив повторяющиеся части в вспомогательных функциях:

function withStatusLog(fn) {
  return function(val) {
    console.log(('Status: ' + val[0].toUpperCase() + val.slice(1)).blue);
    return fn(val);
  };
}
function newDelayedStatusPromise(executor) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      executor(withStatusLog(resolve), withStatusLog(reject))
    }, 1000);
  });
}

function washDishes({soap}) {
  return newDelayedStatusPromise((resolveStatus, rejectStatus) => {
    if (soap) {
      resolveStatus('clean dishes');
    } else {
      rejectStatus('dirty dishes');
    }
  })
}

function addSoap() {
  return newDelayedStatusPromise(resolveStatus => {
    resolveStatus('soap added');
  });
}

function emptyDishwasher() {
  return newDelayedStatusPromise(resolveStatus => {
    resolveStatus('dishes put away'); // or 'dishwasher emptied'?
  });
}
0 голосов
/ 16 декабря 2018

Технически, resolve() и reject() не нуждаются в каких-либо аргументах, потому что их значения выводятся через строковые литералы.Следовательно,

resolve('soap added')

может стать

resolve()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...