Как добавить nano.uuid в цепочку обещаний, которые читаются из БД? - PullRequest
0 голосов
/ 22 марта 2019

Я использую этот код с экспресс-маршрутизацией и nano:

router.get('/', function (request, response) {
  db.view('designdoc', 'bydate', { 'descending': true })
    .then(results => {
      // data manipulation of results, all blocking and fine
      return results;
    })
    .then(results => {
        nano.uuids(1)
          .then(uuids => {
            results.uuid = uiids['uuids'][0];
            resolve(); // return ?
          })
          .catch(error => {
          // ?
           });
      });
      return results;
    })
    .then(results => { response.json(results); }) // how to have results.uuid = something from the previous then ?
    .catch(error => { response.json(error); });

Я хочу добавить uuid из nano.uuid к результатам, но не могу понять, как управлять обещанием внутри следующего then.

Как я могу получить данные из nano.uuid, дождаться их и добавить в results?

1012 * редактировать * Я переключаюсь на асинхронный подход, предложенный @ narayansharma91, и этот код решает мою проблему: router.get('/', async function (request, response) { const results = await db.view('designdoc', 'bydate', { 'descending': true }); var uuid = await nano.uuids(1); results.uuid = uuid.uuids[0]; response.json(results); } Но я все же хотел бы понять решение, основанное на обещаниях.

Ответы [ 4 ]

1 голос
/ 22 марта 2019

Вам не нужно делать этот длинный скрипт, чтобы получить результат. Вы можете сделать то же самое, используя async/await, как показано ниже.

 router.get('/', async function (request, response) {
     const result = await db.view('designdoc', 'bydate', { 'descending': true })
     console.log(result)//do what ever you want to with result
});
0 голосов
/ 23 марта 2019
router.get('/', function(request, response) {
            let _results;
            db.view('designdoc', 'bydate', {
                    'descending': true
                })
                .then(results => {
                    // data manipulation of results, all blocking and fine
                    // save results in tempopary variable
                    // since we want to use only one level of Promise chains
                    // we need to save results on controller scope level to allow access in further chains
                    _results = results;
                    // we don't need to return since every `then` by default return `Promise`
                })
                .then(() => {
                    // you can just return, since nano.uuids return Promise
                    // next then chain will be called once action completed
                    return nano.uuids();
                })
                .then(uuids => {
                    // use _results from controller level scope
                    // uuids will be injected as a result of return nano.uuids()
                    _results.uuid = uiids['uuids'][0];
                    response.json(_results);
                })
                .catch(error => {
                    response.json(error);
                });
        }

Для лучшего понимания цепочки Promise, я всегда советую прочитать эту замечательную статью

0 голосов
/ 23 марта 2019

Я не сильно изменился из вашего кода, потому что вы хотели решение в обещаниях.Вам не нужно вызывать resol (), потому что .then () сделает это за вас.После добавления uuids к результату просто верните результаты.

router.get('/', function (request, response) {
    db.view('designdoc', 'bydate', {
            'descending': true
        })
        .then(results => {
            // data manipulation of results, all blocking and fine
            return results;
        })
        .then(results => {
            results = nano.uuids(1)
                .then(uuids => {
                    results.uuid = uiids['uuids'][0];
                    return results;
                })
                .catch(error => {
                    throw error;
                });
            return results;
        }).then(results => {
            response.json(results);
        }) // how to have results.uuid = something from the previous then ?
        .catch(error => {
            response.json(error);
        });

})
0 голосов
/ 22 марта 2019
   function successcb(results){
    return new Promise(function(resolve, reject) {
    nano.uuids(1)
  .then(uuids => {
    results.uuid = uiids['uuids'][0];
    resolve(results);
  })
  .catch(error => {
    throw err;
   });
  });
}

router.get('/', function (request, response) {
  db.view('designdoc', 'bydate', { 'descending': true })
    .then(results => {

      return results;
    })
    .then(successcb)
    .then(results => { response.json(results); }) 
    .catch(error => { response.json(error); });
...