рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ WebHorker рдХреЛ
XMLHttpRequest рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдФрд░ рдЙрд╕реА рд╕рдордп
рдИрдПрд╕ 6 рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░реЗрдВред
рд▓рдХреНрд╖реНрдп рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рд╣реИ:
new PromiseWorker(array => array.sort()).Invoke([3,2,1]).then(result => console.log(result));
(рдЗрд╕рдХреЗ рдмрд╛рдж,
рддреАрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рд╢реНрд░рдорд┐рдХ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЛ рдПрдХрдорд╛рддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ:
new Worker("/JS/worker.js")
ред рдСрдиреНрд╕рдореЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдЯрдХрд╛рдПрдВ, рдкреЛрд╕реНрдЯрдореЗрдЬреЗрдЬ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рд╡рд░реНрдХрд░ рдлрд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕реНрдЯрд╛рдЗрд▓ рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣реЗрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреВрд░реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреЛрд▓реНрдб рд╣реИ, рдФрд░ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░рдирд╛ рдЕрдм рдХрдо рдирд╣реАрдВ рд╣реИред рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐
рдмреВрдБрдж рдФрд░ рд╡рд╛рджреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдЗрдирдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
var FnToWorker = fn => { var workerBody = "self.addEventListener('message'," + "function (d) {" + "var result;" + "try {" + "result = (" + fn.toString() + ")(d.data.Data);" + "self.postMessage({ Result: result, Id: d.data.Id });" + "} catch (e) {" + "self.postMessage({ Error: e, Id: d.data.Id });" + "}" + "});" var worker = new Worker(URL.createObjectURL(new Blob([workerBody]))); return worker; }
рд╣рд╛рдВ, рдПрдХ рдШреГрдгрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдпреЛрдЬрди рд╣реИ, fn.toString () рдФрд░ рдЕрдиреНрдп рднрдпрд╛рдирдХ рдЪреАрдЬреЗрдВ ... рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдмрдВрдж рдЪрд░, рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕
рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╢реНрд░рдорд┐рдХ рдзрд╛рдЧреЗ рд╕реЗ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Function.prototype.bind) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ fn.toString () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЗрдирд╡реЛрдХ рджрд┐рдЦреЗрдЧрд╛:
var promises = [];
рд╡рд╛рджрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рд╣рдо рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рджреЛ рддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ: рд╕рдорд╛рдзрд╛рди рдФрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ред рдпреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХреНрд░рдорд╢рдГ рд╕рдлрд▓ рдФрд░ рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
var OnMessage = data => { if (data.data.Error) { promises[data.data.Id].reject(data.data.Result); } else { promises[data.data.Id].resolve(data.data.Result); } promises[data.data.Id] = undefined; }
рдЦреИрд░, рдпрд╣ рдЗрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
http://jsfiddle.net/sXJ4M/1/рдмреЗрд╢рдХ, рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдЖрдк рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдореЗрдВ рд╢реНрд░рдорд┐рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдмрдбрд╝реЗ рдФрд░ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХрд░рддреЗ рд╣реИрдВред