рд╕рдВрднрд╡рддрдГ рд╕рднреА рд▓реЛрдЧ рдЬреЛ рдиреЛрдбрдЬ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрд╡реЗрдВрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдЬрдм рддрдХ рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЕрдЧрд▓реЗ рдХреЛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрдВрддрд┐рдо рдШрдЯрдирд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдРрд╕реЗ рдХрдИ рдХрд╛рд░реНрдп рд╣реИрдВ рдФрд░ рд╡реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╣реИрдВ? рдФрд░ рдЕрдЧрд░ рд╣рдо рддрдм рддрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ?
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ред рдиреЛрдбрдЬ рдореЗрдВ рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЛ рдХрд┐рд╕реА рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╡реЗрдВрдЯ рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдШрдЯрдирд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ: рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд╝рдВрдХреНрд╢рди "рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" рдХрд░рдХреЗред рдПрдХ рдмрд╛рдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ (рд╣рдо рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ) рдФрд░ рд╣рдо рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЕрдЧрд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
рддреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
console.log("begin"); setTimeout(function () { console.log("2000ms timeout"); setTimeout(function () { console.log("1500ms timeout"); setTimeout(function () { console.log("1000ms timeout"); setTimeout(function () { console.log("final"); }, 500); }, 1000); }, 1500); }, 2000); console.log("end");
рд╣рдо 2000ms рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо 1500ms рдкрд░ рджреВрд╕рд░рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ 1000ms рдкрд░ рддреАрд╕рд░рд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ, 500ms рдкрд░ рдЕрдВрддрд┐рдоред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
рд╢реБрд░реВ рдХрд░рдирд╛
рдЕрдВрдд
2000 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
1500 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
1000 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
рдЕрдВрддрд┐рдо
рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рд╣реИ рдЕрдЧрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдкрд╣рд▓реЗ рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рджреВрд╕рд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ - рджреВрд╕рд░реЗ рд╕реЗ рдкрд╣рд▓реЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ!
рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИ?
рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рдзреАрдореА рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдЬреЛ рд╣рдо рдЙрд╕рд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рд╣рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рднреА рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ? рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдХрдИ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рде рд▓реЙрдиреНрдЪ, рдФрд░ рдЗрдирдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИ, рдбрд┐рд╕реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬреА рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред
рдереЛрдбрд╝рд╛ рдХрдард┐рди
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рднреА рдСрдкрд░реЗрд╢рди рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
console.log("begin"); setTimeout(function () { console.log("2000ms timeout"); }, 2000); setTimeout(function () { console.log("1500ms timeout"); }, 1500); setTimeout(function () { console.log("1000ms timeout"); }, 1000); setTimeout(function () { console.log("final"); }, 500); console.log("end");
рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:
рд╢реБрд░реВ рдХрд░рдирд╛
рдЕрдВрдд
рдЕрдВрддрд┐рдо
1000 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
1500 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
2000 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ "рд▓рдВрдмреЗ рдХрд╛рд░реНрдпреЛрдВ" рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рд▓рдЧрднрдЧ рдврд╛рдИ рдЧреБрдирд╛ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ!
рдлрд┐рд░, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрдм рддрдХ рдЬрдм рддрдХ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
рдФрд░ рднреА рдореБрд╢реНрдХрд┐рд▓
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдкрд┐рдЫрд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдкрд┐рдЫрд▓реЗ рд╕рднреА рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рдмрд╛рдж рд╣реА рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ рд╣реИ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рд╕рдВрдЧрдардиред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд╣рдорд╛рд░реЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдХрд╛рдЙрдВрдЯрд░ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЬрдм рдЕрдВрддрд┐рдо рд╢реВрдиреНрдп рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╣рдорд╛рд░реЗ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝рдВрдХреНрд╢рди" рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
var counter = 3; console.log("begin"); setTimeout(function () { console.log("2000ms timeout"); if (-- counter == 0) final(); }, 2000); setTimeout(function () { console.log("1500ms timeout"); if (-- counter == 0) final(); }, 1500); setTimeout(function () { console.log("1000ms timeout"); if (-- counter == 0) final(); }, 1000); function final() { setTimeout(function () { console.log("final"); }, 500); } console.log("end");
рдкрд░рд┐рдгрд╛рдо:
рд╢реБрд░реВ рдХрд░рдирд╛
рдЕрдВрдд
1000 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
1500 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
2000 рдореА рдЯрд╛рдЗрдордЖрдЙрдЯ
рдЕрдВрддрд┐рдо
рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!
рд╕рдорд╕реНрдпрд╛рдПрдВ рддрдм рд╢реБрд░реВ рд╣реЛрдВрдЧреА рдЬрдм рдПрдХ рджрд┐рди рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рдкрд░ рдПрдХ рдпреВрдирд┐рдЯ рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрди рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝рдВрдХреНрд╢рди" рдХреЙрд▓ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рдПрдВрдЧреЗред
"рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рдо рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП!" рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдореИрдВ рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ: рдЯрд┐рдо рдХреИрд╕рд╡реЗрд▓ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛
рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрдирдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ рдЬреЛ рдореИрдВрдиреЗ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдерд╛ред
рд▓рдкреЗрдЯреЗрдВ:
function Combo(finalCallback) { this.finalCallback = finalCallback; this.result = []; this.counter = 0; } Combo.prototype = { "add" : function (callback) { var that = this; this.counter ++; return function () { that.result[that.counter - 1] = callback.apply(this, arguments); that.check(); }; }, "check" : function () { var that = this; this.counter --; if (this.counter == 0) process.nextTick(function () { that.finalCallback.call(that, that.result); }); } };
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝рдВрдХреНрд╢рди" рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрд╡рд░рдг рд╕рднреА "рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ" рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛ред рдЬреЛрдбрд╝реЗрдВ рдкрджреНрдзрддрд┐ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛рддреА рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рдЕрдкреЗрдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди" рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреА рд╣реИред рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдмрдВрдзрд┐рдд "рдЕрдкреЗрдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди" рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рд╛рдкреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЪреЗрдХ рд╡рд┐рдзрд┐ рдЪрд▓рд╛рддрд╛ рд╣реИред рдЪреЗрдХ рд╡рд┐рдзрд┐, рдмрджрд▓реЗ рдореЗрдВ, рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдХрдо рдХрд░ рджреЗрддреА рд╣реИ рдФрд░ рдЬрдм рдЕрдВрддрд┐рдо рд╢реВрдиреНрдп рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддреА рд╣реИ, рддреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рдкрд╛рд░рд┐рдд "рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝рдВрдХреНрд╢рди" рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ" рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝рдВрдХреНрд╢рди" рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
var test = new Combo( function (result) { console.log("final"); console.log("result:"); for (var i in result) { console.log(" \"" + i + "\" : \"" + result[i] + "\""); } }); console.log("begin"); setTimeout(test.add(function () { console.log("2000ms"); return "2000ms"; }), 2000); setTimeout(test.add(function () { console.log("1500ms"); return "1500ms"; }), 1500); setTimeout(test.add(function () { console.log("1000ms"); return "1000ms"; }), 1000); console.log("end");
рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
рд╢реБрд░реВ рдХрд░рдирд╛
рдЕрдВрдд
1000ms
1500ms
2000ms
рдЕрдВрддрд┐рдо
рдкрд░рд┐рдгрд╛рдо:
"0": "2000 рдореА"
"1": "1500 рдореА"
"2": "1000 рдореА"
рдмреНрдпреВрдЯреА!
рдЕрдм рд╣рдо рдмрдВрдж рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдШрдЯрдирд╛) рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрд╡рд░рдг рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдЖрд╡рд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдФрд░ рд╣рдорд╛рд░реЗ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝рдВрдХреНрд╢рди" рдХреЛ рд╕рднреА "рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ" рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдирдП "рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ" рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
рд╕рдмрд╕реЗ рдХрдард┐рди рдмрд╛рдд
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛ рдЕрдЧрд░ рдХреЛрдИ рдПрдХреНрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдП? рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдЬреЛ рдПрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ: рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╣реЛред рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рддреНрд░реБрдЯрд┐ рдШрдЯрдирд╛ рдХреЛ "рдлреЗрдВрдХ" рджреЗрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЕрдВрддрд┐рдо рдШрдЯрдирд╛ "рдЕрдВрдд" рдХреЛ рдлреЗрдВрдХрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ "рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ" рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирддреАрдЬрддрди, "рд▓рдВрдмрд┐рдд рдлрд╝рдВрдХреНрд╢рди" рдХрднреА рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣рдореЗрдВ "рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ" рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
function Combo(finalCallback) { this.finalCallback = finalCallback; this.result = {}; this.counter = 0; } Combo.prototype = { "add" : function (callback, id) { var that = this; if (!id) id = this.counter; this.counter ++; return function () { if (!that.result.hasOwnProperty(id)) { that.result[id] = callback.apply(this, arguments); that.check(); } }; }, "remove" : function (id, result) { this.result[id] = result; this.check(); }, "check" : function () { var that = this; this.counter --; if (this.counter == 0) process.nextTick(function () { that.finalCallback.call(that, that.result); }); } };
рджреВрд╕рд░реЗ, рд╡реИрдХрд▓реНрдкрд┐рдХ, рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк "рдЕрдкреЗрдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди" рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, "рдЕрдкреЗрдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди" рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдм рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдирд┐рд╖реНрдХрд╛рд╕рди рд╡рд┐рдзрд┐ рдХреЛ "рдЕрдкреЗрдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди" рдФрд░ "рдЧрд▓рддреА рд╕реЗ рдкрд░рд┐рдгрд╛рдо" рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдЧреНрд░рд╣рдг рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
var test = new Combo(function (result) { console.log("final"); console.log("result:"); for (var i in result) { console.log(" \"" + i + "\" : \"" + result[i] + "\""); } }); console.log("begin"); setTimeout(test.add(function () { console.log("2000ms"); return "2000ms"; }), 2000); setTimeout(test.add(function () { console.log("1500ms"); return "1500ms"; }, "1500ms"), 1500); setTimeout(test.add(function () { console.log("1000ms"); return "1000ms"; }), 1000);
рдкрд░рд┐рдгрд╛рдо:
рд╢реБрд░реВ рдХрд░рдирд╛
рдЕрдВрдд
1000ms
1250ms рдкрд░ 1500ms рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рд╣реИ
2000ms
рдЕрдВрддрд┐рдо
рдкрд░рд┐рдгрд╛рдо:
"0": "2000 рдореА"
"2": "1000 рдореА"
"1500ms": "1500ms рдореЗрдВ рддреНрд░реБрдЯрд┐"
рдирд┐рд╖реНрдХрд░реНрд╖
рдмреЗрд╢рдХ, рд░реИрдкрд░ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рд╡рд╕реНрддреБ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдХрд╕рд░рдд рдмрди рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рдЗрддреНрдореАрдирд╛рди рдФрд░ рд╕реЛрдЪ-рд╕рдордЭрдХрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╡реЗрдВрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдЦреИрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдореБрджрд╛рдп рдХреА рдорджрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛: рд╢рд╛рдпрдж рдХрд┐рд╕реА рдФрд░ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИред