<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hoxy,,coding,,? ya nadoo,,</title>
    <link>https://hongitaa.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 24 May 2026 16:07:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hongitaa</managingEditor>
    <item>
      <title>JavaScript 개요</title>
      <link>https://hongitaa.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;스크립트 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;언어란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;기본 프로그램의 동작을 사용자의 요구에 맞게 수행되도록 해주는 용도로 사용 됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;매우 빠르게 배우고 짧은 소스코드 파일로 상호 작용하도록 고안되었음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;Java Script&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;웹 브라우저에서 많이 사용하는 인터프리터 방식의 객체지향 프로그래밍 언어.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;ECMA 스크립트 표준을 따르는 대표적인 웹 기술.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;작성 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;소스는 함수 단위로 작성하고, 이벤트 속성을 사용해서 구동 되게 함. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt; 이벤트 속성은 태그마다 차이가 있음. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt; on이벤트명=&quot;실행할 함수명([전달값])&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1. inline 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;태그에 직접 간단한 소스코드를 작성해서 실행 되게 하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1624111432723&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button onclick=&quot;window.alert('버튼 클릭 확인');&quot;&amp;gt;경고창 출력&amp;lt;/button&amp;gt;
&amp;lt;button onclick=&quot;console.log('버튼 클릭 확인');&quot;&amp;gt;console 출력&amp;lt;/button&amp;gt;
&amp;lt;h4 onmouseover=&quot;this.style.backgroudColor='red'&quot;&amp;gt;마우스 오버&amp;lt;/h4&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2. internal 방식&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;script 태그 영역에 작성해서 실행되게 하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;head 태그, body 태그에 작성 가능&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1624111567391&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button onclick=&quot;testfn();&quot;&amp;gt;함수 실행 확인용 버튼&amp;lt;/button&amp;gt;

&amp;lt;script type=&quot;text/Javascript&quot;&amp;gt;
  // 자바스크립트 주석

  // public void methodName(){} : Java
  // 자바스크립트에서 함수 작성 시 함수명 앞에 반환자료형(return type) 붙이지 않음
  function testfn() {
  	alert('testfn() 함수 실행 활인');
  }
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;3. external 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;별도의 js 파일로 작성해서 가져다 사용하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1624111632996&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;script src=&quot;js/sample.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;button onclick=&quot;samp();&quot;&amp;gt;samp() 실행&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/40</guid>
      <comments>https://hongitaa.tistory.com/40#entry40comment</comments>
      <pubDate>Sat, 19 Jun 2021 23:07:44 +0900</pubDate>
    </item>
    <item>
      <title>forEach &amp;amp; filter &amp;amp; map &amp;amp; sort &amp;amp; reduce</title>
      <link>https://hongitaa.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623343662423&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const companies = [
    {name: &quot;Company One&quot;, category: &quot;Finance&quot;, start: 1981, end: 2003},
    {name: &quot;Company Two&quot;, category: &quot;Retail&quot;, start: 1992, end: 2008},
    {name: &quot;Company Three&quot;, category: &quot;Auto&quot;, start: 1999, end: 2007},
    {name: &quot;Company Four&quot;, category: &quot;Retail&quot;, start: 1985, end: 2010},
    {name: &quot;Company Five&quot;, category: &quot;Technology&quot;, start: 2009, end: 2017},
    {name: &quot;Company Six&quot;, category: &quot;Finance&quot;, start: 2000, end: 2015},
    {name: &quot;Company Seven&quot;, category: &quot;Auto&quot;, start: 1986, end: 1998},
    {name: &quot;Company Eight&quot;, category: &quot;Technology&quot;, start: 2011, end: 2018},
    {name: &quot;Company Nine&quot;, category: &quot;Retail&quot;, start: 1980, end: 1989}
];

const ages = [33, 12, 20, 16, 5, 54, 21, 44, 61, 13, 15, 45, 25, 64, 32];

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. forEach&lt;/p&gt;
&lt;pre id=&quot;code_1623375073537&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// basic for
for(let i = 0; i &amp;lt; companies.length; i++){
    console.log(companies[i]);
}

// forEach
companies.forEach(function(company) {
    console.log(company.name);
})

/*
Company One
Company Two
Company Three
Company Four
Company Five
Company Six
Company Seven
Company Eight
Company Nine
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. filter&lt;/p&gt;
&lt;pre id=&quot;code_1623375132756&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const canDrink2 = ages.filter(function(age){
    if(age &amp;gt;= 21){
        return true;
    }
})
console.log(canDrink2);
// [ 33, 54, 21, 44, 61, 45, 25, 64, 32] 

// more clean code
const canDrink3 = ages.filter(age =&amp;gt; age &amp;gt;= 21);
console.log(canDrink3);


// Filter retail companies
const retailCompanies = companies.filter(function(company){
    if(company.category === 'Retail'){
        return true;
    }
})
console.log(retailCompanies);
/*
[
  { name: 'Company Two', category: 'Retail', start: 1992, end: 2008 },
  { name: 'Company Four', category: 'Retail', start: 1985, end: 2010 },
  { name: 'Company Nine', category: 'Retail', start: 1980, end: 1989 }
]
*/

// more clean code
const retailCompanies2 = companies.filter(company =&amp;gt; company.category === 'Retail');
console.log(retailCompanies2);


// Get 80s companies
const eightiesCompanies = companies.filter(company =&amp;gt; (company.start &amp;gt;= 1980 &amp;amp;&amp;amp; company.start &amp;lt; 1990));
console.log(eightiesCompanies);
/*
[
  { name: 'Company One', category: 'Finance', start: 1981, end: 2003 },
  { name: 'Company Four', category: 'Retail', start: 1985, end: 2010 },
  { name: 'Company Seven', category: 'Auto', start: 1986, end: 1998 },
  { name: 'Company Nine', category: 'Retail', start: 1980, end: 1989 }
]
*/

// Get companies that lasted 10 years or more
const lastedTenYears = companies.filter(company =&amp;gt; (company.end - company.start &amp;gt;= 10));
console.log(lastedTenYears);
/*
[
  { name: 'Company One', category: 'Finance', start: 1981, end: 2003 },
  { name: 'Company Two', category: 'Retail', start: 1992, end: 2008 },
  { name: 'Company Four', category: 'Retail', start: 1985, end: 2010 },
  { name: 'Company Six', category: 'Finance', start: 2000, end: 2015 },
  { name: 'Company Seven', category: 'Auto', start: 1986, end: 1998 }
] 
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. map&lt;/p&gt;
&lt;pre id=&quot;code_1623375200957&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Create array of company names
const companyNames = companies.map(function(company){
    return company.name;
})
console.log(companyNames);

// more clean code
const companyNames2 = companies.map(company =&amp;gt; company.name)
console.log(companyNames2);


const testMap = companies.map(
                        company =&amp;gt; 
                        `${company.name} [${company.start} - ${company.end}]`);
console.log(testMap);
/*
[
  'Company One [1981 - 2003]',
  'Company Two [1992 - 2008]',
  'Company Three [1999 - 2007]',
  'Company Four [1985 - 2010]',
  'Company Five [2009 - 2017]',
  'Company Six [2000 - 2015]',
  'Company Seven [1986 - 1998]',
  'Company Eight [2011 - 2018]',
  'Company Nine [1980 - 1989]'
]
*/

const agesSquare = ages.map(age =&amp;gt; Math.sqrt(age));
console.log(agesSquare);
/*
[
  5.744562646538029, 3.4641016151377544,
   4.47213595499958,                  4,
   2.23606797749979, 7.3484692283495345,
   4.58257569495584,    6.6332495807108,
  7.810249675906654,  3.605551275463989,
  3.872983346207417,  6.708203932499369,
                  5,                  8,
  5.656854249492381
]
*/
const agesTimesTwo = ages.map(age =&amp;gt; age * 2);
console.log(agesTimesTwo);
/*
[ 66,  24,  40, 32, 10, 108, 42, 88, 122, 26, 30, 90, 50, 128, 64]
*/

const ageMap = ages
    .map(age =&amp;gt; Math.sqrt(age))
    .map(age =&amp;gt; age * 2);
console.log(ageMap);
/*
[
  11.489125293076057,  6.928203230275509,
    8.94427190999916,                  8,
    4.47213595499958, 14.696938456699069,
    9.16515138991168,   13.2664991614216,
  15.620499351813308,  7.211102550927978,
   7.745966692414834, 13.416407864998739,
                  10,                 16,
  11.313708498984761
]
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. sort&lt;/p&gt;
&lt;pre id=&quot;code_1623375256069&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Sort companies by start year
const sortedCompanies = companies.sort(function(c1, c2){
    if(c1.start &amp;gt; c2.start){
        return 1;
    } else {
        return -1;
    }
});
console.log(sortedCompanies);

/*
[
  { name: 'Company Nine', category: 'Retail', start: 1980, end: 1989 },
  { name: 'Company One', category: 'Finance', start: 1981, end: 2003 },
  { name: 'Company Four', category: 'Retail', start: 1985, end: 2010 },
  { name: 'Company Seven', category: 'Auto', start: 1986, end: 1998 },
  { name: 'Company Two', category: 'Retail', start: 1992, end: 2008 },
  { name: 'Company Three', category: 'Auto', start: 1999, end: 2007 },
  { name: 'Company Six', category: 'Finance', start: 2000, end: 2015 },
  { name: 'Company Five', category: 'Technology', start: 2009, end: 2017},
  { name: 'Company Eight', category: 'Technology', start: 2011, end: 2018}
]
*/

// more clean code
const sortedCompanies2 = companies.sort((a,b) =&amp;gt; (a.start &amp;gt; b.start ? 1 : -1));
console.log(sortedCompanies2);


// Sort ages
const sortAges = ages.sort((a, b) =&amp;gt; a - b);
console.log(sortAges);
/*
 [ 5, 12, 13, 15, 16, 20, 21, 25, 32, 33, 44, 45, 54, 61, 64 ]
*/

const sortAges2 = ages.sort((a, b) =&amp;gt; b - a);
console.log(sortAges2);
/*
[ 64, 61, 54, 45, 44, 33, 32, 25, 21, 20, 16, 15, 13, 12, 5]
*/
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. reduce&lt;/p&gt;
&lt;pre id=&quot;code_1623375301836&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let ageSum = 0;
for(let i = 0; i &amp;lt; ages.length; i++){
    ageSum += ages[i];
}
console.log(ageSum);
// 460

const ageSum2 = ages.reduce(function(total, age) {
    return total + age;
}, 0);
console.log(ageSum2);
// 460

// more clean code
const ageSum3 = ages.reduce((total, age) =&amp;gt; total + age, 0);
console.log(ageSum3);


// Get total years for all companies
const totalYears = companies.reduce(function(total, company){
    return total + (company.end - company.start);
}, 0);
console.log(totalYears);
// 122

// more clean code
const totalYears2 = companies.reduce((total, company) =&amp;gt; total + (company.end - company.start), 0);
console.log(totalYears2);



// Combine Methods
const combined = ages
    .map(age =&amp;gt; age * 2)
    .filter(age =&amp;gt; age &amp;gt;= 40)
    .sort((a, b) =&amp;gt; a - b)
    .reduce((a, b) =&amp;gt; a + b, 0);

console.log(combined);
// 798&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/39</guid>
      <comments>https://hongitaa.tistory.com/39#entry39comment</comments>
      <pubDate>Fri, 11 Jun 2021 01:48:58 +0900</pubDate>
    </item>
    <item>
      <title>reduce()</title>
      <link>https://hongitaa.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623368962917&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) =&amp;gt; T): T;
reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) =&amp;gt; T, initialValue: T): T;
    &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;@param&amp;nbsp;callbackfn&lt;/span&gt;&amp;nbsp;A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;@param&amp;nbsp;initialValue&lt;/span&gt;&amp;nbsp;If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Example&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&lt;/p&gt;
&lt;pre id=&quot;code_1623369380991&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Student {
    constructor(name, age, enrolled, score) {
    this.name = name;
    this.age = age;
    this.enrolled = enrolled;
    this.score = score;
    }
}
const students = [
    new Student('A', 29, true, 45),
    new Student('B', 28, false, 80),
    new Student('C', 30, true, 90),
    new Student('D', 40, false, 66),
    new Student('E', 18, true, 88)
];


const result = students.reduce((prev, curr) =&amp;gt; {
    console.log('------');
    console.log(prev);
    console.log(curr);
    return prev + curr.score;
}, 0);    // I'll start with a zero
// Returned value enters prev the next time it
console.log(result / students.length); 
// -&amp;gt; 73.8

/*

------
prev 0
curr Student { name: 'A', age: 29, enrolled: true, score: 45 }
------
prev 45
curr Student { name: 'B', age: 28, enrolled: false, score: 80 }
------
prev 125
curr Student { name: 'C', age: 30, enrolled: true, score: 90 }
------
prev 215
curr Student { name: 'D', age: 40, enrolled: false, score: 66 }
------
prev 281
curr Student { name: 'E', age: 18, enrolled: true, score: 88 }
73.8

*/


// more clean code
const result = students.reduce((prev, curr) =&amp;gt; prev + curr.score,0);
console.log(result / students.length);
// 73.8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prev&amp;nbsp;:&amp;nbsp;The&amp;nbsp;returned&amp;nbsp;value&amp;nbsp;comes&amp;nbsp;in.&lt;br /&gt;curr : Items in an array are passed sequentially.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;/p&gt;
&lt;pre id=&quot;code_1623371244803&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, -1, 2, 3];

let sum = 0;
for (let n of numbers)
    sum += n;

console.log(sum);
// 5

// reduce ver
const sum2 = numbers.reduce((accumulator, currentValue) =&amp;gt; {
	console.log('-----');
    console.log('a : ',accumulator);
    console.log('b : ',currentValue);
    console.log('a + b : ',accumulator + currentValue);
    return accumulator + currentValue;
}, 0);
/*
    -----
    a :  0
    b :  1
    a + b :  1
    -----
    a :  1
    b :  -1
    a + b :  0
    -----
    a :  0
    b :  2
    a + b :  2
    -----
    a :  2
    b :  3
    a + b :  5
*/

console.log(sum2);
// 5


// more clean code
const sum3 = numbers.reduce(
    (accumulator, currentValue) =&amp;gt; accumulator + currentValue
);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>JavaScript</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/38</guid>
      <comments>https://hongitaa.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 11 Jun 2021 01:48:18 +0900</pubDate>
    </item>
    <item>
      <title>map()</title>
      <link>https://hongitaa.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623335211960&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;map&amp;lt;U&amp;gt;(callbackfn: (value: T, index: number, array: T[]) =&amp;gt; U, thisArg?: any): U[];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;Calls a defined callback function on each element of an array, and returns an array that contains the results.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;@param&amp;nbsp;callbackfn&lt;/span&gt;&amp;nbsp;A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;@param thisArg &lt;/span&gt;An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Example&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623335304707&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Student {
    constructor(name, age, enrolled, score) {
      this.name = name;
      this.age = age;
      this.enrolled = enrolled;
      this.score = score;
    }
  }
  
  const students = [
    new Student('A', 29, true, 45),
    new Student('B', 28, false, 80),
    new Student('C', 30, true, 90),
    new Student('D', 40, false, 66),
    new Student('E', 18, true, 88),
  ];
  
  const result = students.map((student) =&amp;gt; student.score);
  
  console.log(result);
  // [ 45, 80, 90, 66, 88 ]
   &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;/p&gt;
&lt;pre id=&quot;code_1623341642102&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const days = [&quot;Mon&quot;, &quot;Tue&quot;, &quot;Wed&quot;, &quot;Thurs&quot;, &quot;Fri&quot;];

const smilingDays = days.map(day =&amp;gt; `  ${day}`);

// same code
const addSmile = day =&amp;gt; `  ${day}`;
const smilingDays = days.map(addSmile);
console.log(smilingDays);
// [ '  Mon', '  Tue', '  Wed', '  Thurs', '  Fri' ]

const addIndexDays = days.map((day, index) =&amp;gt; `#${index} ${day}`);
console.log(addIndexDays);
// [ '#0 Mon', '#1 Tue', '#2 Wed', '#3 Thurs', '#4 Fri' ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&lt;/p&gt;
&lt;pre id=&quot;code_1623341707223&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const numbers = [1, -1, 2, 3];

const filtered = numbers.filter(n =&amp;gt; n &amp;gt;= 0);
// can filter value in an array

const items = filtered.map(n =&amp;gt; {
    const obj = { value : n };
    return obj;
})

console.log(items);
// [ { value: 1 }, { value: 2 }, { value: 3 } ]

// same code
const items2 = filtered.map(n =&amp;gt; ({ value : n }));

// same code
const items3 = numbers
    .filter(n =&amp;gt; n &amp;gt;= 0)
    .map(n =&amp;gt; ({ value : n }));

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. filter and map chaining&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623342812668&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const items4 = numbers
  .filter(n =&amp;gt; n &amp;gt;= 0)
  .map(n =&amp;gt; ({ value : n }))
  .filter(obj =&amp;gt; obj.value &amp;gt; 1);
// can call the filter one more time 
// get an object and maybe want to get objects with value greater than 1

console.log(items4);
// [ { value: 2 }, { value: 3 } ]


const items5 = numbers
  .filter(n =&amp;gt; n &amp;gt;= 0)
  .map(n =&amp;gt; ({ value : n }))
  .filter(obj =&amp;gt; obj.value &amp;gt; 1)
  .map(obj =&amp;gt; obj.value);
// and again call the map method
// maybe map each object to a number
// so i can read the value property and return it

console.log(items5);
// [ 2, 3 ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/37</guid>
      <comments>https://hongitaa.tistory.com/37#entry37comment</comments>
      <pubDate>Thu, 10 Jun 2021 23:33:10 +0900</pubDate>
    </item>
    <item>
      <title>forEach()</title>
      <link>https://hongitaa.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623324141719&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; forEach(callbackfn: (value: T, index: number, array: T[]) =&amp;gt; void, thisArg?: any): void;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;Performs the specified action for each element in an array.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;@param callbackfn&lt;/span&gt; A function that accepts up to three arguments.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;forEach calls the callbackfn function one time for each element in the array.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;@param thisArg&lt;/span&gt; An object to which the this keyword can refer in the callbackfn function.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;If thisArg is omitted, undefined is used as the this value.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;example.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623328507403&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let numbers = [1, 2, 3, 4, 5, 6, 7];

numbers.forEach(function(num) {
  console.log(num);
})

// same code
numbers.forEach(num =&amp;gt; console.log(num));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;/p&gt;
&lt;pre id=&quot;code_1623328539102&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let fruits2 = [' ',' ',' ',' ',' '];
let fruits3 = [' '];

fruits2.forEach(fruit =&amp;gt; fruits3.push(fruit));
console.log(fruits3);
// [ ' ', ' ', ' ', ' ', ' ', ' ' ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623328797061&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let sum = 0;
let numbers2 = [20, 11, 33, 10, 7, 77];

numbers2.forEach(addTotal);

function addTotal(num){
  sum += num;
}
console.log(sum);
// 158

// same code
numbers2.forEach(number =&amp;gt; sum += number)
console.log(sum);
// 158&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.&lt;/p&gt;
&lt;pre id=&quot;code_1623328857987&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let number3 = [20, 11, 33, 10, 7, 77, 5];
number3.forEach((number, index, array) =&amp;gt; {
  array[index] = number * 2;
})

console.log(number3);
// [40, 22, 66, 20, 14, 154, 10]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/36</guid>
      <comments>https://hongitaa.tistory.com/36#entry36comment</comments>
      <pubDate>Thu, 10 Jun 2021 21:44:18 +0900</pubDate>
    </item>
    <item>
      <title>3. async &amp;amp; await</title>
      <link>https://hongitaa.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;API to make Promise seem concise, simple and synchronous&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;clear style of using promise &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;async is a syntactic sugar that makes Promise easier to use.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. async&lt;/p&gt;
&lt;pre id=&quot;code_1623318473611&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function fetchUser(){
    return new Promise((resolve, reject) =&amp;gt; {
        // do network request in 10 secs...
        resolve('lexie');
    })
}

const user = fetchUser();
user.then(console.log);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;if I put &quot;async&quot; keyword in front of the function, The code block automatically changes to Promise.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. await ✨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #1a5490;&quot;&gt;await is only available inside async function&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623319093067&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function delay(ms) {
    return new Promise(resolve =&amp;gt; setTimeout(resolve, ms));
} 

async function getApple() {
    await delay(1000);
    // if happened some error here
    // throw new Error(`error: apple`); 
    return ' ';
}

async function getBanana(){
    await delay(1000);
    // if happened some error here
    // throw new Error(`error: banana`); 
    return ' ';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Make execute function&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623320107757&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function pickFruits1() {
    return getApple()
    .then(apple =&amp;gt; {
       return getBanana()
       .then(banana =&amp;gt; `${apple} + ${banana}`);
    })
}

pickFruits1().then(console.log);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;I can get   +   in 2 secs.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;It's two returns, but it looks complicated.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;So, let's fix this&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623320244062&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function pickFruits2(){
    const apple = await getApple();
    const banana = await getBanana();
    return `${apple} + ${banana}`;
}

pickFruits2().then(console.log);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;I can get   +   in 2 secs.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;And It's more simple.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;But I don't need to wait in order to get apple and banana.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;I want to get that at the same time.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;So,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623320552124&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function pickFruits3(){
    const applePromise = getApple();
    const bananaPromise = getBanana();
    const apple = await applePromise;
    const banana = await bananaPromise;
    return `${apple} + ${banana}`;
} 

pickFruits3().then(console.log);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;I can get   +   in 1 secs.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Because~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;As soon as it is created, the function is executed.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;In parallel, apples and bananas are obtained at the same time.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;But it's not clean code&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Finally, I can fix like this through the Promise API&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623320770125&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function pickAllFruits(){
    return Promise.all([getApple(),getBanana()])
    .then(fruits =&amp;gt; fruits.join(' + '));
}

pickAllFruits().then(console.log);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;send function as an array type and receives an array of fruits.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;I can get   +   in 1 secs.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;+)&lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;&amp;nbsp;Promise.race()&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623321104978&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function delay(ms) {
    return new Promise(resolve =&amp;gt; setTimeout(resolve, ms));
} 

async function getApple() {
    await delay(2000);
    return ' ';
}

async function getBanana(){
    await delay(1000);
    return ' ';
}


function pickOnlyOne(){
    return Promise.race([getApple(), getBanana()]);
}

pickOnlyOne().then(console.log);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Among the promises passed to the array, only the first to return the value is passed on.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;I can get   in 1 sec.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;There's more detail &amp;gt;&lt;/span&gt;&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/35</guid>
      <comments>https://hongitaa.tistory.com/35#entry35comment</comments>
      <pubDate>Thu, 10 Jun 2021 19:36:36 +0900</pubDate>
    </item>
    <item>
      <title>2. Promise</title>
      <link>https://hongitaa.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Promise is JavaScript object for asynchronous operfation.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;State : pending -&amp;gt; fulfilled or rejected&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Producer vs Consumer&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623307965624&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new Promise(executor)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;A&amp;nbsp;Promise&amp;nbsp;object is created using the&amp;nbsp;new&amp;nbsp;keyword and its constructor.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Producer&lt;/p&gt;
&lt;pre id=&quot;code_1623308008113&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// when new Promise is created, the executor runs automatically.
const promise = new Promise((resolve, reject) =&amp;gt; {
    // doing some heavy work (network, read files)
    console.log('doing something...');
    setTimeout(() =&amp;gt; {
        resolve('lexie');
       // reject(new Error('no network'));
    },2000);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;This constructor takes a function, called the &quot;executor function&quot;, as its parameter. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;This function should take two functions as parameters. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;The first of these functions (resolve) is called when the asynchronous task completes successfully and returns the results of the task as a value. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;The second (reject) is called when the task fails, and returns the reason for failure, which is typically an error object.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2. Consumer : then, catch, finally&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623308579124&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;promise
    .then((value) =&amp;gt; {
        console.log(value);
    })
    .catch(error =&amp;gt; {
        console.log(error);
    })
    .finally(() =&amp;gt; {
        console.log('finally');
    });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;then &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;: &lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;After doing well in Promise, Run &lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;when the resolve function is called.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;: &lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;Process functions rejected by Promise using catch.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;finally&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;: &lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;It is a function that is performed at the end.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Promise Chaning&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;The&amp;nbsp;then&amp;nbsp;method returns a&amp;nbsp;Promise&amp;nbsp;which allows for method chaining.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;If the function passed as handler to&amp;nbsp;then&amp;nbsp;returns a&amp;nbsp;Promise, an equivalent&amp;nbsp;Promise&amp;nbsp;will be exposed to the subsequent&amp;nbsp;then&amp;nbsp;in the method chain. The below snippet simulates asynchronous code with the&amp;nbsp;setTimeout&amp;nbsp;function.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623310087076&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const fetchNumber = new Promise((resolve, reject) =&amp;gt; {
    setTimeout(() =&amp;gt; resolve(1), 1000);
})

fetchNumber
.then(num =&amp;gt; num * 2)
.then(num =&amp;gt; num * 3)
.then(num =&amp;gt; {
    return new Promise((resolve, reject) =&amp;gt; {
        setTimeout(() =&amp;gt; resolve(num - 1), 1000);
    });
})
.then(num =&amp;gt; console.log(num));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;=&amp;gt; Expect the number 5 to come out in 2 sec.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623310830248&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Promise.resolve('foo')
  // 1. Receive &quot;foo&quot;, concatenate &quot;bar&quot; to it, and resolve that to the next then
  .then(function(string) {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        string += 'bar';
        resolve(string);
      }, 1);
    });
  })
  // 2. receive &quot;foobar&quot;, register a callback function to work on that string
  // and print it to the console, but not before returning the unworked on
  // string to the next then
  .then(function(string) {
    setTimeout(function() {
      string += 'baz';
      console.log(string); // foobarbaz
    }, 1)
    return string;
  })
  // 3. print helpful messages about how the code in this section will be run
  // before the string is actually processed by the mocked asynchronous code in the
  // previous then block.
  .then(function(string) {
    console.log(&quot;Last Then:  oops... didn't bother to instantiate and return &quot; +
                &quot;a promise in the prior then so the sequence may be a bit &quot; +
                &quot;surprising&quot;);

    // Note that `string` will not have the 'baz' bit of it at this point. This
    // is because we mocked that to happen asynchronously with a setTimeout function
    console.log(string); // foobar
  });

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;=&amp;gt; logs, in order:&lt;br /&gt;Last Then: oops... didn't bother to instantiate and return a promise in the prior then so the sequence may be a bit surprising&lt;br /&gt;foobar&lt;br /&gt;foobarbaz&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Error Handling&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623311624337&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const getHen = () =&amp;gt; 
    new Promise((resolve, reject) =&amp;gt; {
        setTimeout(() =&amp;gt; resolve(' '), 1000);
    });
const getEgg = hen =&amp;gt; 
    new Promise((resolve, reject) =&amp;gt; {
        setTimeout(() =&amp;gt; reject(new Error(`error ! ${hen} =&amp;gt;  `)), 1000);
    });
const cook = egg =&amp;gt; 
    new Promise((resolve, reject) =&amp;gt; {
        setTimeout(() =&amp;gt; resolve(`${egg} =&amp;gt;  `), 1000);
    });

getHen()
    .then(hen =&amp;gt; getEgg(hen))
    .then(egg =&amp;gt; cook(egg))
    .then(meal =&amp;gt; console.log(meal));

// more clean code
getHen() 
    .then(getEgg)
    .catch(error =&amp;gt; {
        return ' ';
    })
    .then(cook)
    .then(console.log)
    .catch(console.log);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Result&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;112&quot; data-filename=&quot;ㅇㄹ.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHGdwd/btq6VI7RKGT/wfvRSX6zDE4ea0KKEohLiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHGdwd/btq6VI7RKGT/wfvRSX6zDE4ea0KKEohLiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHGdwd/btq6VI7RKGT/wfvRSX6zDE4ea0KKEohLiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHGdwd%2Fbtq6VI7RKGT%2FwfvRSX6zDE4ea0KKEohLiK%2Fimg.png&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;112&quot; data-filename=&quot;ㅇㄹ.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;I returned bread instead of eggs because there was an error in the process of getting eggs.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;So in conclusion, I can cook with bread.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;Let's change the last callback function code to Promise.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;Before (using callback)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623313427887&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

 class UserStorage {
     loginUser(id, password, onSuccess, onError){
         setTimeout(() =&amp;gt; {
            if(
                (id === 'lexie' &amp;amp;&amp;amp; password === 'sehong') ||
                (id === 'sehong' &amp;amp;&amp;amp; password === 'lexie')
            ) {
                onSuccess(id);
            } else {
                onError(new Error('not found'));
            }
         },2000);
     }

     getRoles(user, onSuccess, onError){
        setTimeout(() =&amp;gt; {
            if(
                (user === 'lexie')
            ) {
                onSuccess({ name: 'lexie', role: 'admin'});
            } else {
                onError(new Error('not access'));
            }
         }, 1000);
     }
 }

 const userStorage = new UserStorage();
 const id = prompt('enter your id');
 const password = prompt('enter your password');
 userStorage.loginUser(
     id,
     password,
     user =&amp;gt; {
         userStorage.getRoles(
                                user, 
                                userWithRole =&amp;gt; {
                                    alert(`Hello ${userWithRole.name}, you have a ${userWithRole.role} role`)
                                },
                              error =&amp;gt; console.log(error));
         },
     error =&amp;gt; console.log(error)
 );

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;After (using Promise)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623313381612&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

 // Callback Hell example -&amp;gt; Promise
 class UserStorage {
     loginUser(id, password){
         return new Promise((resolve, reject) =&amp;gt; {
            setTimeout(() =&amp;gt; {
                if(
                    (id === 'lexie' &amp;amp;&amp;amp; password === 'sehong') ||
                    (id === 'sehong' &amp;amp;&amp;amp; password === 'lexie')
                ) {
                    resolve(id);
                } else {
                    reject(new Error('not found'));
                }
             },2000);
         })
     }

     getRoles(user){
         return new Promise((resolve, reject) =&amp;gt; {
            setTimeout(() =&amp;gt; {
                if(user === 'lexie') {
                    resolve({ name: 'lexie', role: 'admin'});
                } else {
                    reject(new Error('not access'));
                }
             }, 1000);
         })
     }
 }

 const userStorage = new UserStorage();
 const id = prompt('enter your id');
 const password = prompt('enter your password');

 userStorage.loginUser(id, password)
 .then(userStorage.getRoles)
 .then(user =&amp;gt; alert(`Hello ${user.name}, you have a ${user.role} role`))
 .catch(console.log);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;It has become cleaner and easier to read.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/34</guid>
      <comments>https://hongitaa.tistory.com/34#entry34comment</comments>
      <pubDate>Thu, 10 Jun 2021 17:28:07 +0900</pubDate>
    </item>
    <item>
      <title>1. callback function - Synchronous &amp;amp; Asynchronous</title>
      <link>https://hongitaa.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; background-color: #ffffff;&quot;&gt;JavaScript is synchronous.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; background-color: #ffffff;&quot;&gt;Execute the code block by orger after hoisting.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; background-color: #ffffff;&quot;&gt;hoisting: The declaration of a var or a function is lifted.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;Let's see an example&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623299466215&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log('1');   
// -&amp;gt; sync

setTimeout(() =&amp;gt; console.log('2'), 1000);   
// -&amp;gt; async

console.log('3');   
// -&amp;gt; sync


// Synchronous callback
function printImmediately(print){
    print();
}
printImmediately(() =&amp;gt; console.log('hello'));   
// -&amp;gt; sync


// Asynchronous callback
 function printWithDelay(print, timeout){
     setTimeout(print, timeout);
 }
 printWithDelay(()=&amp;gt; console.log('async callback'), 2000); 
 // -&amp;gt; async&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;I put a mixture of Sync functions and Async functions.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;And the following results can be seen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;218&quot; data-filename=&quot;0.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4A1CS/btq6WPx4oQH/tiLVPMjUkozk7VKECfadEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4A1CS/btq6WPx4oQH/tiLVPMjUkozk7VKECfadEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4A1CS/btq6WPx4oQH/tiLVPMjUkozk7VKECfadEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4A1CS%2Fbtq6WPx4oQH%2FtiLVPMjUkozk7VKECfadEK%2Fimg.png&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;218&quot; data-filename=&quot;0.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;Sync functions are executed in batches first.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;And Async functions are excuted on time set.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;The method of using callbacks is a common approach to asynchronous programming.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #666666;&quot;&gt;Let's make it a simple login using a callback.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623303060856&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; // Callback Hell example
 
 // 1.
 class UserStorage {
     loginUser(id, password, onSuccess, onError){
         setTimeout(() =&amp;gt; {
            if(
                (id === 'lexie' &amp;amp;&amp;amp; password === 'sehong') ||
                (id === 'sehong' &amp;amp;&amp;amp; password === 'lexie')
            ) {
                onSuccess(id);
            } else {
                onError(new Error('not found'));
            }
         },2000);
     }
     // 2. 
     getRoles(user, onSuccess, onError){
        setTimeout(() =&amp;gt; {
            if(
                (user === 'lexie')
            ) {
                onSuccess({ name: 'lexie', role: 'admin'});
            } else {
                onError(new Error('not access'));
            }
         }, 1000);
     }
 }

 // 3.
 const userStorage = new UserStorage();
 
 // 4.
 const id = prompt('enter your id');
 const password = prompt('enter your password');
 
 // 5.
 userStorage.loginUser(
     id,
     password,
     user =&amp;gt; {
         userStorage.getRoles(
                                user, 
                                userWithRole =&amp;gt; {
                                    alert(`Hello ${userWithRole.name}, you have a ${userWithRole.role} role`)
                                },
                              error =&amp;gt; console.log(error));
         },
     error =&amp;gt; console.log(error)
 );

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1. Create a function that receives an ID and password and excecutes the function according to the match.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2. &lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;If the ID is lexie, create a function that tells you the permission.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;3. Create a new UserStorage&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;4. Receive an ID and password&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;5. &lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;Pass id and password, onSuccess function and error function to execute login function&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;So, every new action is inside a callback. &lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;It too complecated and r&lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;eadability is bad..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;That&amp;rsquo;s fine for few actions, but not good for many, so we&amp;rsquo;ll see other variants soon.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There's more detail &amp;nbsp;&amp;gt; &lt;a href=&quot;https://javascript.info/callbacks&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://javascript.info/callbacks&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kor ver &amp;gt; &lt;a href=&quot;https://ko.javascript.info/callbacks&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.javascript.info/callbacks&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>callback</category>
      <category>callback function</category>
      <category>javascript callback</category>
      <category>동기적함수</category>
      <category>비동기적함수</category>
      <category>자바스크립트 콜백</category>
      <category>콜백함수</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/33</guid>
      <comments>https://hongitaa.tistory.com/33#entry33comment</comments>
      <pubDate>Thu, 10 Jun 2021 14:07:20 +0900</pubDate>
    </item>
    <item>
      <title>3. bulk Operation - insert / update / upsert / delete</title>
      <link>https://hongitaa.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;Now let's put the data read fr&lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;om the csv file into the database&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623251655033&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// bulk insert into mongodb
async function insertingData(arrData) {
  try {
    await client.connect();
    const testCollection = await client.db(&quot;restaurant&quot;).collection('location');
   	// -&amp;gt; This mean, I want to access 'location' collection in a database called 'restaurant'
    
    await testCollection.deleteMany({});  
    // -&amp;gt; will remove everything
    
    
    // insert 
    var bulk = testCollection.initializeUnorderedBulkOp();
    arrData.forEach(element =&amp;gt; {
      console.log('element',element);
      // this element is thhe value I converted to an array last time.
      bulk.insert(element);
    });
    
    await bulk.execute();


    // update
     var bulk2 = testCollection.initializeUnorderedBulkOp();
     arrData.forEach(element =&amp;gt; {
       bulk2.find({_id:'609ce32cd477b9020367a495'}).updateOne({$set: {restaurantDisplayName:'Lexie Bar'}});
       console.log('updated');
     });
     
     await bulk2.execute();


    // upsert 
    var bulk3 = testCollection.initializeUnorderedBulkOp();
    arrData.forEach(element =&amp;gt; {
    bulk3.find({_id:'609ce32cd477b9020367a495'}).upsert().updateOne({$set:{restaurantPhone:'12341234'}});  
    // Update if there is a line that matches the _id I'm looking for
    
    bulk3.find({_id:'leaveTheDoorOpen'}).upsert().updateOne(
      {$set:{
            restaurantPhone:'12341234',
            restaurantDisplayName:'Bruno Mars Bar'}});
      /*
        -&amp;gt; Insert if no row matches the _id I'm looking for
        Look at Atlas, I can see that it was newly inserted 
        because there was no such data
        
        _id: &quot;leaveTheDoorOpen&quot;
        restaurantPhone: &quot;12341234&quot;
        
        like this!
      */
      console.log('upsert');
    });
    
    await bulk3.execute();


    // delete
     var bulk4 = testCollection.initializeUnorderedBulkOp();
     arrData.forEach(element =&amp;gt; {
        bulk4.find({_id:'leaveTheDoorOpen'}).delete();
        console.log('deleted');
        // -&amp;gt; A document with this id has been deleted

        // update key to null
        bulk4.find({_id:'leaveTheDoorOpen'}).update({$unset:{restaurantPhone:&quot;&quot;}});
        console.log('unset');
        // -&amp;gt; deleted only restaurantPhone key
      
     });
     await bulk4.execute();

  } finally {
    await client.close();
  }
} 


async function run(){
  await connectDb(); 
  const locationData = readCsv('./locations.csv');
  const csvArr = csvToArray(locationData);
  await insertingData(csvArr.slice(0,3));
}

run().catch(console.dir);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;initializeUnorderedBulkOp()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;: Initializes and returns a new Bulk() operations builder for a collection.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;The&amp;nbsp;builder&amp;nbsp;constructs&amp;nbsp;an&amp;nbsp;ordered&amp;nbsp;list&amp;nbsp;of&amp;nbsp;write&amp;nbsp;operations&amp;nbsp;that&amp;nbsp;MongoDB&amp;nbsp;executes&amp;nbsp;in&amp;nbsp;bulk.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MongoDB</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/32</guid>
      <comments>https://hongitaa.tistory.com/32#entry32comment</comments>
      <pubDate>Thu, 10 Jun 2021 00:15:14 +0900</pubDate>
    </item>
    <item>
      <title>2. How to read csv file and convert to Array</title>
      <link>https://hongitaa.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1623233409789&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const fs = require('fs');

// 1. read file (csv)
const readCsv = (text: string): string =&amp;gt; {
  const data = fs.readFileSync(text,'utf-8');
  console.log('data',data);
  // -&amp;gt; expect string type contents in csv file
  return data;
}


// 2. convert file to array
function csvToArray(file, separator=&quot;,&quot;){
   const [headersString, ...lines] = file.split(&quot;\n&quot;);
   // -&amp;gt; divide each line by line
   const headers = headersString.split(separator);
   // -&amp;gt; the top line of csv
   // top line involved keys so need split method 
   
   // make to array all the lines under the header
   const result = lines.map((lineString) =&amp;gt; {
      const values = lineString.split(separator);
      const el = headers.reduce(function(object, header, index){
        if(!header.includes('.')){
          object[header] = values[index];
        }
        console.log('object',object);
        return object;
      },{});
      console.log('el',el);
      return el;
   })
   console.log('result', result);
   return result;
}

// execute method
async function run(){
  await connectDb(); 
  const locationData = readCsv('./locations.csv');
  const csvArr = csvToArray(locationData);
}

run().catch(console.dir);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;reduce()&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;: Calls the specified callback function for all the elements in an array.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;map()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;: Calls a defined callback function on each element of an array, and returns an array that contains the results.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;For map methods and reduce methods, I will post in more detail in the JavaScript category.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MongoDB</category>
      <author>hongitaa</author>
      <guid isPermaLink="true">https://hongitaa.tistory.com/31</guid>
      <comments>https://hongitaa.tistory.com/31#entry31comment</comments>
      <pubDate>Wed, 9 Jun 2021 19:56:54 +0900</pubDate>
    </item>
  </channel>
</rss>