Подождите, пока не будут вызваны все обратные вызовы - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть компонент в реагировать нативно, который показывает все чаты, которые есть у пользователя.Основная логика должна быть в componentDidMount ().Вот упрощенная версия:

componentDidMount(){
     ConnectyCube.chat.list({}, function(error, dialogs) {
        chats = dialogs.map(chat => {
            const opponentId = //some logic
            ConnectyCube.users.get(function(error, res){
                //some logic to populate chats 
            });
            }
        )

        this.setState({chats: chats})
        }
    );
}

Основная проблема, другими словами, в том, что я не знаю, как использовать несколько обратных вызовов (по одному для каждого чата, которые есть у пользователя) для обработки структуры данных 'чаты, чтобы setState в конце.Может быть, моя проблема в том, что я думаю синхронно, потому что я новичок в подходе, основанном на событиях.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 23 февраля 2019

Вот способ, которым вы можете отслеживать количество оставшихся запросов и запускать некоторый код, когда они все завершены.Обратите внимание, что это именно то, что делает Promise.all .

//some kind of global or component level variable, tracks the number of pending requests left
var remaining = 0;

componentDidMount(){
     ConnectyCube.chat.list({}, function(error, dialogs) {
        // set remaining to how many dialogs there are
        remaining = dialogs.length;
        chats = dialogs.map(chat => {
            const opponentId = //some logic
            ConnectyCube.users.get(function(error, res){
                //some logic to populate chats

                // decrement remaining and check if we're done
                if (--remaining === 0) {
                  finalCallback(); // in here you do your setState.
                }
            });
            }
        )

        this.setState({chats: chats})
        }
    );
}
...