asyncMap은 두 개의 인자를 가진다.
첫째는 비동기 함수들이 담긴 배열이고,
둘째는 callback 함수이다.
배열에 있는 각각의 함수는 별개의 callback을 가지고 있으며,
마지막 함수까지 실행되고 나면, 그 때 두번째 인자로 받은 callback을 invoke한다.
결과값으로 return되는 배열은 첫번째 인자로 받았던 함수들의 결과값을 차례대로 가지고 있어야 한다.
비록 그 함수들이 비동기로 작동하였을지라도!
Example
asyncMap([ function(cb){ setTimeout(function(){ cb('one'); }, 200); }, function(cb){ setTimeout(function(){ cb('two'); }, 100); } ], function(results){ // the results array will equal ['one','two'] even though // the second function had a shorter timeout. console.log(results); // ['one', 'two'] });
비동기적으로 작동하는 함수를 동기적으로 처리하도록 하고 싶을 때에는,
해당 함수 내에 callback 함수를 넣거나,
비동기 함수를 Promise 형태로 만들어서 이용하면 가능해진다.
//promise way var asyncMap = async function(tasks, callback){ let result = []; for (let i = 0; i < tasks.length; i++) { result.push( await new Promise(resolve => { tasks[i](resolve); //tasks[i] function의 arguments가 resolve의 arguments로 담겨서 실행됨. await으로 pending 풀어줌. }) ); } return callback(result); }; //callback way var asyncMap = function(tasks, callback){ //In tasks, many functions are waiting for being called //callback muse be called at last task //each task gets arguments and implement it asynchronously //args are numbers in test cases(e.g. 1,2,3,4,5) //should store args in output array, so we //must have callback in callback function let output = []; let count = 0 for(let i = 0; i < tasks.length; i++) { tasks[i](function(args) { output[i] = args count++ console.log('i', i) console.log('count', count) if(count === tasks.length) { callback(output) } }) } }
로마 숫자 변환 - Javascript (0) | 2019.07.13 |
---|---|
shuffleDeck (카드섞기) - Javascript (0) | 2019.07.10 |
balanced parentheses - Javascript (1) | 2019.06.27 |
BreadthFirstSearch in Tree - Javascript (0) | 2019.06.21 |
powerSet - recursion (0) | 2019.06.20 |
댓글 영역