Аспекты в вашем вопросе неясны:
Вы не говорите, когда установлен this.state.firstValue
, и как это связано с тем, что вы пытаетесь достичь.
У вас есть for-loop
, где вы можете установить одно и то же значение несколько раз.
- Вы изменяете состояние, а не устанавливаете его.Это не хорошо, см. Этот ТАК вопрос , чтобы узнать больше об этом.
Мы можем кое-что сделать, чтобы ваш код было легче понять.Ниже я покажу возможный рефакторинг.Объясняя, что я делаю на каждом этапе.Я использую async/await
, потому что это может привести к гораздо более аккуратному и легкому чтению кода, вместо использования promises
, где вы можете потеряться в обратных вызовах.
- Получить все ключи из AsyncStorage
- Убедитесь, что есть значение для всех ключей.
- Отфильтруйте ключи так, чтобы мы включали только те, которые не содержат строку
'not'
. - Используйте
Promise.all
, эта часть важна, поскольку она в основном получает все значения длякаждый из ключей, которые мы только что нашли, и помещает их в массив с именем items
- Каждый объект в массиве
items
имеет свойства key
и value
. - Затем мы фильтруем
items
так, чтобы остались только те, у которых item.value === 'true'
. - Затем мы фильтруем
items
, чтобы остались только те, у которых item.value !== 'true'
.(это может быть необязательным, это действительно зависит от того, что вы хотите сделать) - Что мы возвращаем?Вам нужно добавить эту часть.
Вот рефакторинг:
_getFetchData = async () => {
let allKeys = await AsyncStorage.getAllKeys(); // 1
if (allKeys.length) { // 2
let filteredKeys = allKeys.filter(key => !key.includes('not')); // 3
let items = await Promise.all(filteredKeys.map(async key => { // 4
let value = await AsyncStorage.getItem(key);
return { key, value }; // 5
}))
let filteredTrueItems = items.filter(item => items.value === 'true'); // 6
let filteredFalseItems = items.filter(item => items.value !== 'true'); // 7
// now you have two arrays one with the items that have the true values
// and one with the items that have the false values
// at this points you can decide what to return as it is not
// that clear from your question
// return the value that your want // 8
} else {
// return your default value if there are no keys // 8
}
}
Вы бы назвали эту функцию следующим образом:
_fetchData = async () => {
let channel = await this._getFetchData();
console.log("channel required: " + channel);
}
Хотя вышебудет работать, в настоящее время он не будет возвращать значение, так как вы не указали, какое значение вы хотите вернуть.Я бы посоветовал вам опираться на код, который я написал здесь, и обновить его, чтобы он возвращал нужные вам значения.
Дополнительное чтение
Для дальнейшего чтения я хотел бы предложить эти удивительные статьи Майкла Чана, в которых обсуждаются state
https://medium.learnreact.com/setstate-is-asynchronous-52ead919a3f0
https://medium.learnreact.com/setstate-takes-a-callback-1f71ad5d2296
https://medium.learnreact.com/setstate-takes-a-function-56eb940f84b6
Я бы также предложил потратить некоторое время, чтобы прочитать о async/await
и promises
https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8
И, наконец, этостатья и вопрос SO по Promise.all
довольно хороши
https://www.taniarascia.com/promise-all-with-async-await/
Использование async / await с циклом forEach