Асинхронный foreach реагирует на нативный - PullRequest
0 голосов
/ 07 января 2019

Я создаю чат-приложение с Reaction-native и pouchdb для мобильных устройств, затем у меня есть сервер с socket.io и rethinkdb. В PouchDB я храню все чаты между пользователями, в то время как в rethinkdb я храню «автономные сообщения». Под «автономными сообщениями» я подразумеваю сообщения, отправленные пользователям, которые не подключены к сети (я проверяю это на сервере socket.io).

Теперь у меня проблема. Когда мой пользователь открывает приложение, у меня async componentWillMount вот так:

async componentWillMount(){

    const value = await AsyncStorage.getItem("token");
    this.setState({ token: value });

    var self = this;
    await axios.get(server + '/index.php/api/TokenController/isValid', {headers: {Authorization: this.state.token}}).then((res) => {
        var resJson = JSON.parse(res.data);
        self.setState({userid: resJson.info.id});
    });
    await axios.get(server + '/index.php/api/FriendsController/getList', {headers: {Authorization: this.state.token}}).then((res) => {
        var resJson = JSON.parse(res.data);
        this.setState({friends: resJson.friends});
    });

    this.setState({loading: false});

    this.socket.emit('register', {connection_id: this.state.userid});
    await this.socket.on('hasMessages', data => Promise.all(data).then(res => {
        this.setState({offlineMessages: res});
        this.state.offlineMessages.forEach((v) => {
            console.log(v) // it stops to first iteration
        })
    }));
}

Итак, пользователь выполнил вход, я проверял, является ли токен Valid, и затем я получил список друзей. После этого я регистрирую своего пользователя в своем веб-сокете и отправляю сообщение «hasMessage», если есть сообщения для моего пользователя. (пример:

{
    "from_id":  "76" ,
    "id":  "e5f76ad6-761c-4637-a118-321a844a9634" ,
    "messages": {
        "1546799624050":  "Ciao" ,
        "1546799630274":  "Hola" ,
        "1546799633100":  "Hello" 
    } ,
   "to_id":  "1"
}

Хорошо, есть кое-что для моего пользователя. Таким образом, ответ «hasMessage» что-то вроде этого. Теперь я должен сделать два цикла (один для данных, а другой для сообщений для каждого, я должен создать объект сообщения для всех сообщений). Как я могу это сделать? Я использую Promise, который работает, но затем вложенный forEach останавливается на первой итерации, и когда я перезагружаю свое приложение, я вижу в консоли другие итерации. Какая-то идея?

Я не очень хорош в запросе async / await / Promise, я только учусь!

...