Как построить второй список обещаний из первого списка обещаний и повторить - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть список категорий. Мне нужно посмотреть, если идентификаторы категории доступны в БД, если он затем вставить эти идентификаторы в другую таблицу У меня есть два списка обещаний. то, что я хочу, это вызвать второй список обещаний после первой итерации итераций

// category ids as follows
let categoryIds = [['cat1','cat2', 'cat3'],['cat4','cat5', 'cat6']];

// insert promise
let insertCategoriesPromiseList = [];

// then iterate through the array and get categories from db

categoryIds.filter((categories) => {

   let isCategoryAvailablePromises = [];

   categories.filter((catId) => {
      isCategoryAvailablePromises.push(checkForCategory(catId));
   })

   Promise.all(isCategoryAvailablePromises)
    .then(data => {
      // if all the cat ids are in the db then insert those cat ids
      // into another table
      insertCategoriesPromiseList.push(insertCatIds(data.cat1, data.cat2, data.cat3))
    })

});

function checkForCategory(catId){
   const promise = new Promise((resolve, reject)=> {
     db.any('select categoryName from category where ...')
      .then(data=>{
         // if all the categories are available return 
         resolve(data);
      })
      .catch(e => {
         reject(e);
      })
   })
   return promise;
}

function insertCatIds(catId1, catId2, catId3){
   const promise = new Promise((resolve, reject)=> {
     db.one('insert into products ...')
      .then(data=>{
         // if all the categories are available return 
         resolve(data);
      })
      .catch(e => {
         reject(e);
      })
   })
   return promise;
}

Я хочу выполнить ниже после создания полной insertCategoriesPromiseList, как я должен это сделать ...

Promise.all(insertCategoriesPromiseList)
 .then(p => {

 })
 .catch()

1 Ответ

0 голосов
/ 01 ноября 2018

Я бы переписал это так:

function checkForCategory(catId){
     return db.any('select categoryName from category where ...')
      .then(data=>{
         //massage data if needed
         return data;//return cat id!
      });
}

function insertCatIds(catId1, catId2, catId3){
     return db.one('insert into products ...')
      .then(data=>{
         //massage data if needed
         return data;
      });
}

let load = ['catid1', 'catid2'].map(id => checkForCategory(id));
Promise.all(load).then((...ids) => insertCatIds.apply(this, ids));

Обратите внимание, что я не писал new Promise((resolve, reject) => ..., потому что Promise.prototype.then () фактически возвращает Promise.

Надеюсь, это поможет!

...