рдЕрдиреБрдХреНрд░рдорд┐рдХ рд▓рд╛рдиреЗ рдФрд░ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ 5 рддрд░реАрдХреЗ


рддрдХрдиреАрдХреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЬреНрдЮрд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЬреНрдЮрд╛рди рдХреЗ рд╕реНрддрд░, рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЙрд╕рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╕реЛрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИред рдЕрдХреНрд╕рд░, рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рд░ рдХреЛрдИ рдЙрдирдХреЗ рд▓рд┐рдП рдЖрджреА рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░, рддреИрдпрд╛рд░реА рдХрд░рддреЗ рд╕рдордп, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рд╕реВрдЪреА рд▓рдВрдмреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдЪреАрдЬ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИ рд╡рд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:


  • рдХрд╛рд░рдЦрд╝рд╛рдиреЗ рдХрд╛
  • рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛
  • рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛
  • рдкрд╛рда рдХреЗ рднреАрддрд░ рдХреЛрд╖реНрдардХ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ
  • (mergeSort, insertionSort, bubbleSort, quickSort)
  • ( / / )

, 70 JavaScript, , , , ( , ).


, :



, , .


:


, :


:
fetch(url1) => fetch(url2, resultsUrl1) => fetch(url3, resultsUrl2)

-
compose(res2 => fetch(url3, res2), res1 => fetch(url2, res1), () => fetch(url1))

?

, ( ):


  • async/await

, , ( reduce, ).


, ; , - ; ; .


, . . , , , .


, reduce , Array. :


  • reduce

, fetch , :


function fakeFetch (url, params='-') {
    //           
    console.log(`fakeFetch to: ${url} with params: ${params}`);
    return new Promise(resolve => {
        setTimeout(() => resolve(`${url} is DONE`), 1000);
    })
};

( ):


const urls = ['url1', 'url2', 'url3'];

( 1), . then().then().then() await; await; await; .


, callback. :


fetchSeries(result => console.log(`result: ${result}`))

, . , , .



, , . , , , .


function generatorWay(callback) {
    function* generateSequence() {
        let results;
        for (let i = 0; i < urls.length; i++) {
            results = yield fakeFetch(urls[i], results);
        }
        return results;
    }
    function execute(generator, yieldValue) {
        let next = generator.next(yieldValue);
        if (!next.done) {  
            return next.value
                .then(result => execute(generator, result));
        } else {
            callback(next.value);
        }
    }
    execute(generateSequence())
}


:


  • generateSequence yield' , .
  • execute(generator), next, тАФ , , , next.
  • execute , callback.


, while:


async function asyncGeneratorWay(callback) {
    async function* generateSequence() {
        let results;
        for (let i = 0; i < urls.length; i++) {
            results = yield await fakeFetch(urls[i], results);
        }
        return results;
    }
    let generator = generateSequence();
    let result;
    while (!result || !result.done) {
        result = await generator.next(result && result.value);
    }
    callback(result.value);
}


( ).


for await of , 2.


Async/await


. , async/await. , async, .


async function asyncAwaitWay(callback) {
    const series = async () => {
        let results;
        for (let i = 0; i < urls.length; i++) {  
            results = await fakeFetch(urls[i], results);
        }
        return results;
    }
    const result = await series();
    callback(result);
}


fakeFetch await;


Recursion


, reduce ( ), recursion . . , :


function recursionWay(callback) {  
    const recursion = (arr = [], promise = Promise.resolve()) => {
        if (!arr.length) { 
            return promise;
        }
        const [url, ...restUrls] = arr;
        return promise
            .then(res => recursion(restUrls, fakeFetch(url, res)));
    }
    recursion(urls)
        .then(result => callback(result));
}


shift , . .


Promise.resolve(), -, , , .


Reduce


, , . , , .


function reduceWay(callback) {
    urls
        .reduce((accum, item) => {
            return accum
                .then(res => fakeFetch(item, res))
        }, Promise.resolve())
        .then(result => callback(result));
}


:


  • fakeFetch then;
  • , Promise.resolve(), -, , (Promise) , . :

function reduceWay(callback) {
    urls
        .reduce((accum, item) => {
            if (!accum) {
                return fakeFetch(item);
            }
            return accum
                .then(res => fakeFetch(item, res));
        })
        .then(result => callback(result));
}

2 .



. , :


.
reduce61
async/await9x1.5
recursion10x1.67
()13x2.17
17x2.83

"", , reduce. , ( ). , , :


const reduceWay = callback => urls.reduce(
    (acc, item) => acc.then(res => fakeFetch(item, res)),  
    Promise.resolve())
    .then(result => callback(result));  
}


, , , .


, тАФ . async/await тАФ , . reduce / .


, , тАж .



рдЬреЗрдирд░реЗрдЯрд░


рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЬреЗрдирд░реЗрдЯрд░


рд╕рд░рдгреА: рдХрдо рдХрд░рдиреЗ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐


рдкреНрд░рддреНрдпрд╛рд╡рд░реНрддрди


Async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ


рд╡рд╛рджреЗ


рд╡рд╛рджрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛


рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рдж рдпреВрдкреАрдбреА рдореИрдВ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╛рдпреЛрдЬрди рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрддрд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИ for of:


async function asyncAwaitWay(callback) {
    let results;
    for (const url of urls) {  
        results = await fakeFetch(url, results);
        }
    callback(result);
}

All Articles