Backend/NodeJS

[node] How to double co-routine in promise & loop

하우아유두잉 2019. 11. 26. 17:06

 

 

비동기 작업의 동기화, 코루틴

 

 

 

각 회원들의 프로필과 친구리스트를 

회원별로 새로운 객체에 담고 싶을때

 

co-routine과 promise를 활용하여

DB 작업은 비동기로 처리하고

베이스 루틴은 동기적으로 처리하여

만들어진 객체를 반환한다.

 

이 작업은 코루틴 안에서 작업을 비동기적으로 하면서, 모든 작업이 완료되었을 때 반환한다.

When all jobs are done, this funtion is return and the main tasks are processed asyncronously.

const cofunc = bPromise.coroutine(function* () {
    try { 
      
        ...
      
        const members = yield getMembers();	// get DB
        // [{"id":"", "email":""}, ...]
      	

        const re = yield new bPromise((resolve: any, reject: any) => {
            const list = [];
            members.forEach((member: any, idx: number) => {
            	const temp = [];
                co(function*() {
                    const profile = yield getProfile(member);	// get DB
                    const friends = yield getFriends(member);	// get DB
                    list.push({"member":member, "profile":profile, "friends":friends});
                    
                    return index ;
                }).then((result: any) => {
                    if(index >= members.length-1)
	                    return resolve();
                });
            });
        });
        // [{"member":{"id":"", "email":""}, "profile":{}, "friends":[...]}, ...]
        
        return re;

    } catch (err) { ... }
});


cofunc();

Co-routine in Loop in Promise in Co-routine