2017-01-22 2 views
0

Я запрашиваю элементы с сайта, и мне нужно проверить, содержит ли в нем описание слова «приобрел» и только затем сохранить его в БД.Должен ли я использовать Promise для решения этой задачи?

Так что, когда я делаю что-то Лик это:

items.forEach(function(item) { 
    if(!isPurchased) 
    saveToDb(item) 
} 

Но он не работает (элемент сохраняется в любом случае), так как функция, обеспечиваемая в IF заявлении (isPurchased) возвращения неопределенными (из-за асинхронной узла поведение, я думаю).

Итак, я написал Promise notPurchased:

function notPurchased(advert) { 
    return new Promise(
     function(resolve, reject) { 
     if (description.length == 0) 
      resolve(); 

     return request('adverts', {'count' : 50}, function(resp) { 

      for (i = 0; i < resp.count; i++) { 

      if(resp.response.items[i].text.match('purchased') != null) 
       reject('This item has been purchased!'); 
      } 

      resolve(); 
     }); 
     }); 
} 

, а затем использовать это обещание в цикле ForEach:

response.items.forEach(function(item) { 
    notPurchased(item).then(function() { 
    DB.storeItem(item); 
    }); 
}); 

Это хороший Подход? У меня недостаточно опыта работы с NodeJS, и мне кажется немного сложнее определить обещание для простой функции bool.

ответ

0

Ну, что вы можете сделать, это петля, чтобы искать, какие предметы не находятся в db, а затем вставить все из них с помощью Promise.all. Было бы так:

const itemsNotSaved = items.filter((item) => { 
     //Check if item is in db already. 
     //If it is, return false, if not, true 
}); 

const itemsPromises = itemsNotSaved.map((item) => { 
    //Create a new promise for inserting item 
}); 

//Execute every Promise 
Promise.all(itemsPromises) 
.then((items) => { 
//No errors, items have been inserted in the database 
}) 
.catch((error) => { 
//console.log(error); 
}) 

 Смежные вопросы

  • Нет связанных вопросов^_^