Реагируйте на собственный Android - Promise.all выбрасывает [TypeError: [объект объекта] не повторяется!] Для массива обещаний - PullRequest
0 голосов
/ 27 сентября 2018

Я использую реагировать родной и экспо.У меня есть этот код:

const a = {};
const promises = [];
someArray.forEach(c => {
    a[c] = {
        ref: firebase.ref(`someref/${c}`),
        data: null
    }
    promises.push(new Promise((resolve, reject) => {
       a[c].ref.on('value', (snap) => {
            const data = snap.val() || {};
            // do something with data
            resolve(data);
        },
        (err) => {
            console.error(err)
            return reject(err)
        })
    }))
});

function isIterable(obj) {
    // checks for null and undefined
    if (obj == null) {
        return false;
    }
    return typeof obj[Symbol.iterator] === 'function';
}

console.log(promises)
console.log(isIterable(promises))

Promise.all(promises).then((values)=>{
    console.log("promise all values", values)
}).catch(e=>{
    console.error("promise all failed",e)
})

Я получаю эту ошибку promise all failed TypeError: [object Object] is not iterable! при работе на Android. Отлично работает на iOS и в режиме JS удаленной отладки .Результат console.log(promises) равен

Array [
   Promise {
     "_a": undefined,
     "_c": Array [],
     "_d": false,
     "_h": 0,
     "_n": false,
    "_s": 0,
    "_v": undefined,
   },
 ]

, а странная вещь - console.log(isIterable(promises)) отпечатки false

есть идеи?

1 Ответ

0 голосов
/ 27 сентября 2018

По-видимому, реагировать на нативный на Android не поддерживает символы ES6.Нашел решение здесь

if (Platform.OS === 'android') {
  if (typeof Symbol === 'undefined') {
    console.log('Polyfilling Symbol on Android');
    require('es6-symbol/implement');
    console.log('Polyfilling Array.prototype[Symbol.iterator] on Android');
    if (Array.prototype[Symbol.iterator] === undefined) {
      Array.prototype[Symbol.iterator] = function() {
        let i = 0;
        return {
          next: () => ({
            done: i >= this.length,
            value: this[i++],
          }),
        };
      };
    }
  }
}
...