
рддрдХрдиреАрдХреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЬреНрдЮрд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЬреНрдЮрд╛рди рдХреЗ рд╕реНрддрд░, рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЙрд╕рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╕реЛрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИред рдЕрдХреНрд╕рд░, рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рд░ рдХреЛрдИ рдЙрдирдХреЗ рд▓рд┐рдП рдЖрджреА рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░, рддреИрдпрд╛рд░реА рдХрд░рддреЗ рд╕рдордп, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рд╕реВрдЪреА рд▓рдВрдмреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдЪреАрдЬ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИ рд╡рд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
- рдХрд╛рд░рдЦрд╝рд╛рдиреЗ рдХрд╛
- рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛
- рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛
- рдкрд╛рда рдХреЗ рднреАрддрд░ рдХреЛрд╖реНрдардХ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ
- (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))
?
, ( ):
, , ( reduce
, ).
, ; , - ; ; .
, . . , , , .
, reduce , Array
. :
, 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 .
. , :
"", , 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);
}