2017-01-22 7 views
0

Ich ersuche Artikel von der Website und ich muss überprüfen, ob die Beschreibung des Betreffs Wort "gekauft" hat und nur dann speichern Sie es in DB.Soll ich diese Aufgabe mit Promise lösen?

Also, wenn ich etwas liek dies tun:

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

Aber es funktioniert nicht (Artikel wird in jedem Fall gespeichert), weil Funktion in IF-Anweisung (isPurchased) vorgesehen Zurückkehren undefiniert (wegen asynchroner Knoten Verhalten, denke ich).

Also schrieb ich verspreche 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(); 
     }); 
     }); 
} 

Und dann dieses Versprechen in forEach Schleife:

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

Ist das eine gute aproach? Ich habe nicht genug Erfahrung mit NodeJS und es erscheint mir ein wenig schwierig, ein Versprechen für die einfache Bool-Funktion zu definieren.

Antwort

0

Nun, was Sie tun können, ist eine Schleife zu suchen, welche Elemente nicht in db sind, und dann fügen Sie alle mit Promise.all. wäre wie folgt:

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); 
}) 
Verwandte Themen