Избегайте ада обратного вызова и организации кода Node.js. - PullRequest
0 голосов
/ 11 октября 2018

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

, пожалуйста, помогите мне, как заставить все работать

module.exports = function () {
   return new Promise((resolve, reject) => {
   try {
     const settings = blob();

    var {
    someObject
     } = JSON.parse(requestBody);
  var var1,var2,var3

  let somePromises = [];

  someObject.forEach((p) => {
    p.somepro = 'anything';
  });

  Promise.all(somePromises)
    .then((res) => {
      //replace cart item info
      res.forEach((r) => {
        someObject.forEach((so) => {
              so.info = ''
          });
        });
      });
    return require('/file1')(); // api call 1
    })
    .then((res) => {
      var2 = resp.something // local variable create above var2
      return require('/file2')(); // api call 2
    })
     .then((res) => {
      var3 = resp.something // local variable create above var3
      return require('/file2')(); // api call 3
    })
    .then((r) => {
      // some other maniuplation
    })
    .then(() => {
      // some calulation based on above responses and local variable 
      // assigned
      resolve({
        someObject,
        var1,
        var2
      });
    });
} catch (e) {
  reject(e);
}
 });
};

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

1 Ответ

0 голосов
/ 11 октября 2018

Прежде всего, не resolve объекты, это не так безопасно, потому что свойство then используется Обещанием, если это функция.

Объекты, возвращенные так, как показано, детализированы (симя переменной) когда console.log ing ...

Но давайте предположим, что пока ваше обещание не разрешит ваш объект, какой-то метод добавляет / заменяет then в вашем объекте на метод, тогда у вас будут некоторыеотладка, чтобы сделать на эти обещания.

Подробнее о thenable objects here

Я пытаюсь найти свой код и хочу создать отдельную функцию для каждого .then ()

Я создал собственный метод, который передает значения Promise.all по порядку для каждого .then.

Ваш запрос создать отдельную функцию для каждого .then.Просто скопируйте метод вставки useIfFor и переименуйте / измените его по своему желанию.

PS: Некоторые фрагменты из вашего кода все еще находятся там ... они безвредны.

console.clear();
let module = {};
module.exports = () => {

  return new Promise((resolve, reject) => {

    const settings = {}; //blob();

    var {
      someObject
    } = JSON.parse(typeof requestBody !== 'undefined' ? requestBody : '[]');

    let somePromises = [
      Promise.resolve('some text'),
      Promise.resolve(100),
      Promise.resolve(10000),
    ];

    // var var1, var2, var3

    let stackVariables = [];

    // It passes the first value from Promise.all to the first 'then'
    // the 2nd value to the 2nd `then`
    // the 3rd value to the 3rd `then`
    // ...
    // the N-th value to the N-th `then`

    const useIfFor = (someStringOrNumber) => {

      return (res) => {

        // We'll use the first value of `res` and pass the rest of the values to the next `then`
        let [promiseValue, ...restOfTheValues] = res;


        // START HERE - To add your logic - `promiseValue` is your old 'res'
        console.log('Current `then` value:', promiseValue, '| Label:', someStringOrNumber);

        if (someStringOrNumber === 'my-first-then') {

          promiseValue = 'THIS VALUE IS MODIFIED';
          stackVariables.push(promiseValue); // first value from Promise.all

        } else if (someStringOrNumber === 'my-second-then') {

          stackVariables.push(promiseValue); // second value from Promise.all

        } else if (someStringOrNumber === 'my-third-then') {

          stackVariables.push(promiseValue); // third value from Promise.all

        } else {

          //  You can end it with resolve anywhere
          //resolve(stackVariables);

        }
        // END HERE


        if (typeof promiseValue === 'undefined') {

          // You reached the end, no more values.

          resolve(stackVariables);

        }

        // Passing the remaining values to the next `then`
        return restOfTheValues;

      }

    }

    Promise.all(somePromises)
      .then(useIfFor('my-first-then'))
      .then(useIfFor('my-second-then'))
      .then(useIfFor('my-third-then'))
      .then(useIfFor('done')) // <- here is the resolve because there isn't the 4th promise, therefore, no values
      .catch((err) => {
        reject(err);
      })

  });

};


(module.exports)()
.then(res => {

  console.log('res', res);

}).catch(console.error);
...