allishappy
@allishappy

Как избавиться от callback-hell с помощью промисов?

Пишу на ноде. Код примерно такой:
app.on('location', msg => {
  //обрабатываю данные и получаю переменную data
  one(data, response => {
     //обрабатываю данные и получаю переменную dataTwo
     two(dataTwo, res => {
       //конец кода. Других колббеков больше нет
     });
  })
})


Решил поправить callback-hell, используя промисы. Написал что-то такое:
var main = new Promise((res, rej) => {
  app.on('location', msg => {
    //обрабатываю данные и получаю переменную data
    res(data);
  })
});

main.then((data) => {
  one(data, response => {
    //обрабатываю данные и получаю переменную dataTwo
    return dataTwo; //и тут ошибка
  });
});


Разумеется, я не могу дальше вызвать then() и воспользоваться dataTwo, потому что return относится к коллбеку. Как правильно сделать?
  • Вопрос задан
  • 526 просмотров
Решения вопроса 4
@GreatRash
Избавляясь от callback hell вы при этом нарушаете принцип KISS. Вместо прозрачного и понятного (но не очень модного кода) вам советуют трудно читаемую (зато модную) лапшу. Ну хз...
Ответ написан
Комментировать
Нужно сделать обертки для one и two, которые будут возвращать promise, а дальше main.then(one).then(two);
Ответ написан
Комментировать
v8_jupiter
@v8_jupiter
Или как то так)))
var one = function (data, done) {
    return done(null, data+4);
};

var pr = new Promise((resolve, reject) => {
    return resolve(1);
});

pr.then(i => {
    return one(i, function(err, result) {
     if(err) throw new Error('OMG!');;
     return result;
    });
}).then(res => {
console.log(res);
  return res;  
}).catch(err => {console.log(err)});


P.S. пишу с телефона
Ответ написан
Комментировать
@pekc83
const processData = msg => {
  Promise.resolve(msg)
    .then(msg => {
      return new Promise(resolve, reject) {
        //обрабатываю данные и получаю переменную data
        resolve(data);
      }
    })
    .then(data => {
      return new Promise(resolve, reject) {
        //обрабатываю данные и получаю переменную dataTwo
        resolve(dataTwo);
      }
    })
    .then(dataTwo => {
      //конец кода. Других колббеков больше нет
    })
    .catch(console.error);
}

app.on('location', processData);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы