Как вы превращаете «для» в асин c режим? - PullRequest
0 голосов
/ 10 февраля 2020
export function RecommendList(data) {
    return (dispatch, getState) => {
        let db = loadFB().firestore();
        let query = db.collection('users').where("recommend", ">", "0").orderBy("recommend", "asc")
        let user_list = []; 
        let uid_arr=[];
        let result = [];
        query.get().then(async docs => {
            docs.forEach(doc => {
                const recommender = doc.data();
                const recommend_id = recommender.recommend;
                const recommend_person = recommender.displayName;                                
                user_list.push({id : recommend_id, recommend_person : recommend_person });
            })        

            uid_arr = getRecommendList(user_list);

            console.log("getRecommendList",uid_arr);

            for(let i = 0; i < uid_arr.length; i++) {
                const user_doc = await db.collection('users').doc(uid_arr[i].id).get();
                console.log(user_doc.data());
                let user_info = user_doc.data()
                user_info.betball_dupli_count = uid_arr[i].count;
                user_info.recommend_person = uid_arr[i].person;
                console.log('displayname' , user_info.displayName , 'betball count',user_info.betball_dupli_count,'person',user_info.recommend_person);
                result.push(user_info);
            } 
            console.log('result!', result);
            dispatch({
                type: types.SET_USER_LIST,
                data: result,
                page: 1
            })
        })
    }
}


Я работаю над импортом данных из Fire Store и отправкой их в диспетчерскую. Кстати, я хочу сделать код, который увеличивает эффективность этой работы в асинхронном режиме в javascript. Я хотел бы знать, как ожидать и обрабатывать форму асинхронно.

Короче говоря, как превратить "для" этого кода в асинхронный режим c!

1 Ответ

3 голосов
/ 10 февраля 2020

С минимальными изменениями в существующем коде:

let userQueries = [];
for (let i = 0; i < uid_arr.length; i++) {
    userQueries.push(
        db.collection('users').doc(uid_arr[i].id).get()
        .then(user_doc => {
            console.log(user_doc.data());
            let user_info = user_doc.data()
            user_info.betball_dupli_count = uid_arr[i].count;
            user_info.recommend_person = uid_arr[i].person;
            console.log('displayname', user_info.displayName, 'betball count', user_info.betball_dupli_count, 'person', user_info.recommend_person);
            result.push(user_info);

        })
    )
}
await Promise.all(userQueries);

Внешний for l oop просто инициирует запросы, и часть then каждого из них будет запускаться, когда указан c запрос завершен. За пределами for l oop вызов Promise.all будет ожидать завершения всех запросов, прежде чем продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...