рдореИрдВ рдПрдХ рдореБрдлреНрдд рддреГрддреАрдп рдкрдХреНрд╖ рдЖрд░рд╛рдо рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдиреБрд░реЛрдз рд╕рдорд╡рд░реНрддреА рдФрд░ рдиреНрдпреВрдирддрдо рд╕реБрд░рдХреНрд╖рд╛ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ _рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛ рд╣рд░ 100ms рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдирд╣реАрдВ рдорд╛рд░ рд░рд╣реЗ рд╣реИрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЛрд▓реЛ рдХреЙрд▓ рд▓реЗ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдордп рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдлреИрд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ? рдЧрд▓рддреА рд╕реЗ, рдРрд╕реА рдХреНрд╡реЗрд░реА рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП @export
рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
_рджреЛ рдХреЙрд▓ рдПрдХ рд╕рд╛рде_
const QUERY = gql`
query RestData($email: String!) {
# 1) Query for user ЁЯЪА
users @rest(path: '/users/email?{args.email}', method: 'GET', type: 'User') {
id @export(as: "id")
firstName
lastName
# 2) Sub query for friends fires immediately as well ЁЯЪА
friends @rest(path: '/friends/{exportVariables.id}', type: '[User]') {
firstName
lastName
}
}
}
`;
n+1 рдХреНрд╡реЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╣рд▓реНрдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд▓рд┐рдП (рдпрд╛рдиреА рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рд╡рд┐рд╡рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рднреА рдЙрддреНрдкрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ), рдореИрдВ рд╕рд░реНрд╡рд░ 429 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╕рд░реНрд╡рд░ рд╕реЗ рджрд░ рд╕реАрдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдлрд▓)ред
_рдореИрдВ рдЕрднреА рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реВрдВ: рд░реИрдкрд┐рдВрдЧ рдлрд╝реЗрдЪ_
const restProviders = new RestLink({
endpoints: {
mySlowEndpoint: baseUrl
},
customFetch: (...args) =>
new Promise((resolve, reject) => {
// ЁЯЪЩтЯ╖ЁЯЪХтЯ╖ЁЯЪЧ Implementing my queue logic to fire of fetches
resolve(fetch(...args));
// when enough time has elapsed. ЁЯЪЩтЯ╖ЁЯЪХтЯ╖ЁЯЪЧ
})
})
рдЕрднреА рдореИрдВ рдХрд╕реНрдЯрдо рдХрддрд╛рд░ рддрд░реНрдХ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рдкреЗрдЯ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреЛрдИ "рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрд░реАрдХрд╛" рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕реЗ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ, рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрд╕рдлрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рддреБрд░рдВрдд рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд▓реЛрдб рдкрд░ рдХреБрдЫ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Google рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрднреА рдЬреЛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрднреА рдореИрдВ p-throttle
( рд░реЗрдкреЛ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
// (...)
import pThrottle from "p-throttle";
const restProviders = new RestLink({
endpoints: {
mySlowEndpoint: baseUrl
},
// Throttle fetches to max 1 concurrent request ЁЯЪА and
// min. delay of 0.5 seconds ЁЯЪЩтЯ╖ЁЯЪХтЯ╖ЁЯЪЧ .
customFetch: pThrottle( (...args) => {
return fetch(...args);
}, 1, 500)
})
// (...)
@ D1no рдореИрдВ
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХреА рд╕реАрдзреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╕реНрдЯрдордлрдЪ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдЖрдк рд╕рд╣реА рд╣реИ; рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдЬреЛрдбрд╝реЗ рдХреЗ рддрд░реАрдХреЗ рдорд┐рд▓реЗрдВрдЧреЗ рдЬреЛ рдмрд╣реБрдд рд╣реА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред
рдкреАрдЖрд░ рдореЗрдВ рдореИрдВ рдиреМрд╕рд┐рдЦрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдиреМрд╕рд┐рдЦрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреА-рдХрддрд╛рд░ рдирд┐рдХрд╛рд▓ рджреВрдВрдЧрд╛ред рдЧреНрд░рд╛рдлрд╝рдХреНрдпреВрдПрд▓ рдореЗрдВ рдЧреЗрдЯ-рд╡реЗ-рдбреНрд░рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХрд╛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╕рдорд╡рд░реНрддреА / рдбрд┐рдмрдЧрд┐рдВрдЧ_ рдХреЗ рдХреБрдЫ рдкреНрд░рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЕрд░реЗ @ D1no , рдЖрдк рдпрд╣рд╛рдВ рдбреЙрдХреНрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕реЗ Options
рд╢реАрд░реНрд╖рдХ рдореЗрдВ Complete options
рдКрдкрд░ рдмреИрдардирд╛ рдЪрд╛рд╣рд┐рдПред
рдзрдиреНрдпрд╡рд╛рдж @ рдЯреЛрдВрдмрд░реНрдЯрдиред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдлрд╝реЗрдЪ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдереНрд░реЙрдЯрд▓ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХреА рдХрдкрд▓рд┐рдВрдЧ рдлрд╝реЗрдЪ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдЖрд╣реНрд╡рд╛рди (рдХрд┐рд╕реА рднреА рдордирдорд╛рдиреА) рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХреЛ рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ / рдЙрддреНрд╕реБрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╡рд╢ рдореЗрдВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╕рд░рд▓ рд╕рдорд╡рд░реНрддреА рдФрд░ рдПрдордПрд╕ рд╕реАрдорд╛ рд╡рд┐рдХрд▓реНрдк рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ , рдЕрдВрдд рдореЗрдВ рдЗрддрдирд╛ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
const restProviders = new RestLink({
endpoints: {
mySlowEndpoint: baseUrl
},
maxConcurrency: 2 // Max Concurrency ЁЯЪАЁЯЪА
minThrottle: 500 // Handling Rate Limit in ms ЁЯЪЩтЯ╖ЁЯЪХтЯ╖ЁЯЪЧ
})
рдФрд░/рдпрд╛ рдЗрд╕реЗ рдХреНрд╡реЗрд░реА рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛
const QUERY = gql`
query RestData($email: String!) {
users @rest(path: '/users/email?{args.email}', method: 'GET', type: 'User') {
id @export(as: "id")
firstName
lastName
# NEW: тде ЁЯЪЩтЯ╖ЁЯЪХ тде ЁЯЪАЁЯЪА
friends @rest(throttle: 500, concurrency: 2, path: '/friends/{exportVariables.id}', type: '[User]') {
firstName
lastName
}
}
}
`;
рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рд▓рд╛рдиреЗ рдХреА рдкрджреНрдзрддрд┐ рдХреЛ рдпрд╣ рдкреНрд░рдмрдВрдзрди рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕реЗ рдХрд┐рддрдиреА рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ рдКрдкрд░ рдХреА рдУрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП)ред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реЛрдЪреВрдВрдЧрд╛ред рд╡реИрд╕реЗ рднреА, customFetch
рдХреЛ рд╡рд░реНрддрдорд╛рди рдХреНрд╡реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рд▓реА рдЕрдиреБрд░реЛрдз (рдпрджрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рд╕реНрдорд╛рд░реНрдЯ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП)ред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ / рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (@fbartho) рдЪрд┐рдк рд▓рдЧрд╛ рд╕рдХреЗ? рдореБрдЭреЗ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдЗрд╕рдХреА рдпреЛрдЧреНрдпрддрд╛ рдХреЛ рдордВрдЬреВрд░реА рджреА рдЬрд╛рддреА рд╣реИред
@ D1no рдореБрдЭреЗ рдбреЙрдХреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкрд╕рдВрдж рдЖрдпрд╛ред -- рдХрддрд╛рд░рдмрджреНрдз рдХрд░рдирд╛ рдЙрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рдкрд░реАрдд рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЕрдкрдиреА рдХрдВрдкрдиреА рдХреЗ рдРрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред (рдбрд┐рдбреБрдкреНрд▓рд┐рдХреЗрдЯрд┐рдВрдЧ рд╡рд╣ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрдирд╛рдпрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП)ред
рдЕрд▓рдЧ рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ "maxConcurrency/minThrottle" рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдЕрдкреЛрд▓реЛрд▓рд┐рдВрдХрд░реЗрд╕реНрдЯ "рдЕрдкреЛрд▓реЛ рдореЗрдВ рд╕рд╛рдорд╛рди рдкреНрд▓рдЧрд┐рдВрдЧ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ - рдЬрд┐рди рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдЖрдк рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рдд рдЙрд░реНрдл тАЛтАЛтАЛтАЛрдХрд╕реНрдЯрдо рдлрд╝реЗрдЪ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред - рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореБрдЭреЗ рдпрд╣ рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА-рдкрде рдХреЗ рд▓рд┐рдП рдЗрди рдорд╛рдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝рдХреНрдпреВрдПрд▓ рдореЗрдВ рдЙрдирдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╢реЛрд░ рд▓рдЧрддрд╛ рд╣реИред
рдареАрдХ рд╣реИ - рдореИрдВ рдкрд╣рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреАрдЖрд░ рдХрд░реВрдБрдЧрд╛ред рдЗрд╕рдХреЗ рдКрдкрд░ рдХреА рдкрд░рддреЛрдВ рдХреЛ рдХреНрд░реАрдо рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ customFetch
рдкрд╣рд▓реЗ рдиреАрдЪреЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Google рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрднреА рдЬреЛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрднреА рдореИрдВ
p-throttle
( рд░реЗрдкреЛ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред