Я использую библиотеку localforage для доступа к localStorage / IndexedDB. Чтобы извлечь элемент, вызывается функция localforage.getItem (), которая возвращает Promise, который выполняется при получении данных.
Мне нужно перебрать ключи localforage, вызвать 'getItem' для любого ключа, который соответствует моим критериям, и поместить значение этого ключа в массив 'совпадений'. Однако я не хочу продолжать работу до тех пор, пока не буду уверен, что все значения были успешно добавлены в «совпадения».
Я довольно новичок в Обещаниях, и я не могу понять, как ждать, пока все обещания getItem () не будут выполнены, прежде чем я продолжу.
Я понимаю, что у localforage есть функция 'iterate', но я действительно заинтересован в том, чтобы стать более опытным в использовании Promises, и очень хотел бы знать, как это должно работать.
Вот что я делаю:
var matches = []; // Array to store matched items
localforage.keys() // Get all keys in localforage
.then(function(keys) // When all keys are retrieved, iterate:
{
for(var i in keys)
{
// If the current key matches what I am looking for, add it to the 'matches' array.
if (keys[i].indexOf('something i am looking for') > -1)
{
// Here I need to add this value to my array 'matches', but this requires using the getItem method which returns a Promise and doesn't necessarily fulfill immediately.
localforage.getItem(keys[i])
.then(function(value)
{
matches.push(value);
});
}
}
});
// At this point, I want to proceed only after *all* matches have been added to the 'matches' array (i.e. the getItem() Promises are fulfilled on all items in the loop).
Как мне это сделать? Здесь применяется выражение «ожидание»? Например, я должен сделать
await localforage.getItem(keys[i])
.then(function(value)
... etc
Это сделает функцию getItem синхронной?
Спасибо за любые предложения / указатели.