Функция JavaScript Promise возвращается слишком рано

Функция JavaScript Promise возвращается слишком рано

Я выполняю кучу функций обещания, а затем возвращаю разрешенные массивы. Однако при возврате массивов он возвращает неопределенное значение. Если я использую setInterval для выполнения через 3 секунды, массивы возвращают значения.

Вот код:

 function getData() { var a = new Promise((resolve, reject) ={amp}gt; { getDressData().then(function(result) { resolve(result); console.log('promise a resolved'); }); }); var b = a.then(function(result) { var dressOwners = result.dressOwners; return new Promise((resolve, reject) ={amp}gt; { getOwnerData(dressOwners).then(function(result) { resolve(result); console.log('promise b resolved'); }); }); }); return Promise.all([a, b]) .then(function([resultA, resultB]) { if (resultA) { if (resultB) { console.log('promise all resolved'); return resultA; } } }); } 

Чтобы вернуть массивы:

 function getDreses() { getData().then(function(result) { console.log('Returning promise...'); console.log(result.dresses[1].colour); }); } 

Результат:

обещание разрешено — main.js: 679
обещание б решено — main.js: 688
обещаю все решено — main.js: 697
Возвращение обещания … — main.js: 706
Uncaught (в обещании) TypeError: Невозможно прочитать свойство ‘color’ из undefined в main.js: 707

Однако, если я установлю 3-секундную задержку перед получением каких-либо значений из массива, это работает!

 function getDreses() { getData().then(function(result) { var t = setInterval(() ={amp}gt; { dresses = result.dresses; console.log(dresses.length); console.log(dresses[1].colour); clearInterval(t); }, 3000); }); } 

Результат:

обещание разрешено — main.js: 679
обещание б решено — main.js: 688
обещаю все решено — main.js: 697
Возвращение обещания … — main.js: 706
4 — main.js: 711
Синий — main.js: 712

Итак, как мне подождать, пока массивы будут иметь значения, вместо ожидания с 3-секундной задержкой?

Edit (может быть проблема с getDressData (), решаемым слишком быстро):

 function getDressData() { return new Promise((resolve, reject) ={amp}gt; { var db = firebase.firestore(); var dresses = []; var filters = []; var dressOwners = []; db.collection('dresses').orderBy("date", "desc") .get().then(function(doc) { doc.docs.forEach(function(doc) { var item = doc.data(); dresses.push({ 'dressId' : doc.id, 'colour' : item.colour, 'credit' : item.credit, 'date' : item.date, 'description' : item.description, 'images' : item.images, 'owner' : item.owner, 'size' : item.size }); if(filters.filter(x ={amp}gt; x.size == item.size).length == 0) { filters.push({"size" : item.size, "colours": [item.colour]}); } else { var index = filters.findIndex((x ={amp}gt; x.size == item.size)); if (!filters[index].colours.filter(x ={amp}gt; x.colours == item.colour).length {amp}gt; 0) { filters[index].colours.push(item.colour); } } if (dressOwners.indexOf(item.owner) === -1) { dressOwners.push(item.owner); } }); }); resolve({ "dresses" : dresses, "filters" : filters, "dressOwners" : dressOwners }); }); } 
Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector