Nodejs, Express и Promises - правильно ли я это реализую? - PullRequest
0 голосов
/ 18 апреля 2019

Я написал экспресс-маршрут, в котором входные данные анализируются по трем различным функциям по порядку - после некоторого дальнейшего тестирования я понял, что это очереди запросов и возвращает их по одному за раз.

Теперь я сделал функции, возвращающие обещания, и связал их внутри функции маршрута;все примеры Promise, на которые я смотрел, построены вокруг небольших функций, где очевидно, как реализовать обработку ошибок.Кажется, моя реализация сейчас работает, но мне интересно, а) правильно ли было использовать обещания здесь и б) верна ли моя реализация / как я могу обрабатывать ошибки.

function promiseFunction1(){
    return new Promise(function(resolve,reject){
      //for loop {
          //if statement {
              arr.push(etc);
           }
      }
      resolve(arr);
   });
}

function promiseFunction2(arr){
    return new Promise(function(resolve,reject){
      //if statement{
       }
      //nested{
           //loops{
           }
      }
      //process data

      resolve(data);
   });
}

app.post('/route', function(req,res){
//prep data and declare variables then:

var var1 = promiseFunction1();
var1.then(function(result){
    var2 = result;
    var nextVal = promiseFunction2(var2);
        nextVal.then(function(data){
            res.send(data);
        });
    });
}

Я просто немногоне решается назвать это «правильным», учитывая каждый пример Promise, который я ищу, либо ожидание вызова API, либо функцию для разрешения, а не просто несколько циклов, требующих много времени (поэтому я прав, чтобы реализовать обещания в этих условиях?), а также каждыйПример, который я видел, обрабатывает ошибки внутри функции Promise, но это, как правило, специфично для функций, вызываемых из самого обещания - я так понимаю, в моем случае я должен обрабатывать ошибки в функциях Promise, где они вызываются внутри функции маршрута?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 18 апреля 2019

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

function myFn1() {
  //for loop {
  //if statement {
  // arr.push(etc);
  // }
  return arr;
}

function myFn2(arr){
  //if statement{
    //nested{
      //loops{
      //}
    //}
  //}
  //process data
  return data;
}

Обратите внимание, что, поскольку здесь нет ничего асинхронного, вам нужно return вместо resolve в конце.

Затем, в .post, вы можете вызывать те функции, которые возвращают не обещающие значения значения, и использовать значение немедленно, без необходимости сначала вызывать then:

app.post('/route', function(req,res){
  const result = myFn1();
  const nextVal = promiseFunction2(var2);
  res.send(nextVal);
});

Если есть вероятность, что эти функции выдают ошибки, поскольку они синхронны, заключите их в try / catch:

app.post('/route', function(req,res){
  try {
    const result = myFn1();
    const nextVal = myFn2(result );
    res.send(nextVal);
  } catch(e) {
    // handle errors
  }
});
...