<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JavaScript. Небольшой этюд на тему неблокирующего кода]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=9315</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=9315&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JavaScript. Небольшой этюд на тему неблокирующего кода».]]></description>
		<lastBuildDate>Mon, 03 Mar 2014 09:41:25 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[JavaScript. Небольшой этюд на тему неблокирующего кода]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=80487#p80487</link>
			<description><![CDATA[<p>Задача: создать объект, который через определенные промежутки времени будет обновлять свои свойства или, к примеру, сообщать другим объектам о своем самочувствии. Вопрос: что может случиться, если &quot;неправильно&quot; этот самый объект удалить. По мотивам одного фэйла...</p><p>Сразу хочу предложить пару примеров на Node.js, браузерный код почти не отличается от изложенного ниже.</p><p>test1.js:<br /></p><div class="codebox"><pre><code>
global.obj = new Obj(Date.now());
log(&#039;created&#039;);
 
setTimeout(function() {
  delete global.obj;
  log(&#039;deleted&#039;);  
}, 15000);
 
function Obj(dt) {
  this.dt = dt;  
  var self = this;  
 
  setInterval(function() {
    self.dt = Date.now();  
    log();
  }, 5000);
}
 
function log(s) {
  console.log(&#039;global.obj %s: %s&#039;, s || &#039;&#039;, JSON.stringify(global.obj));  
}
</code></pre></div><p>test2.js:<br /></p><div class="codebox"><pre><code>
global.obj = new Obj(Date.now());
log(&#039;created&#039;);
 
setTimeout(function() {
  delete global.obj;
  log(&#039;deleted&#039;);  
}, 15000);
 
function Obj(dt) {
  this.dt = dt;  
  var self = this;
   
  (function schedule() {
    setTimeout(function() {
      self.dt = Date.now();
      log();
      schedule();
    }, 5000);
  }());  
}
 
function log(s) {
  console.log(&#039;global.obj %s: %s&#039;, s || &#039;&#039;, JSON.stringify(global.obj));  
}
</code></pre></div><p>Вопрос: сколько времени будет выполняться этот код?<br />Пока не выполнишь - не догонишь <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> :<br /><span class="postimg"><img src="http://2.bp.blogspot.com/-3t8_AOMfZzM/UxQ-YBJbzfI/AAAAAAAACZg/ZbjWe-jDyLM/s1600/essay1.jpg" alt="http://2.bp.blogspot.com/-3t8_AOMfZzM/UxQ-YBJbzfI/AAAAAAAACZg/ZbjWe-jDyLM/s1600/essay1.jpg" /></span></p><p>Догадались, в чем подвох?</p><p>Решение: перед удалением объекта не забыть завершить процессы, выполняющиеся асинхронно, для чего необходимо предусмотреть какой-нибудь механизм.</p><p>test3.js:<br /></p><div class="codebox"><pre><code>
global.obj = new Obj(Date.now());
log(&#039;created&#039;);
 
setTimeout(function() {
  clearInterval(global.obj.interval);
  delete global.obj;
  log(&#039;deleted&#039;);  
}, 15000);
 
function Obj(dt) {
  this.dt = dt;  
  var self = this;  
 
  this.interval = setInterval(function() {
    self.dt = Date.now();  
    log();
  }, 5000);
}
 
function log(s) {
  console.log(&#039;global.obj %s:&#039;, s || &#039;&#039;);
  console.dir(global.obj);
}
</code></pre></div><p>test4.js:<br /></p><div class="codebox"><pre><code>
global.obj = new Obj(Date.now());
log(&#039;created&#039;);
 
setTimeout(function() {
  global.obj.interval = false;
  delete global.obj;
  log(&#039;deleted&#039;);  
}, 15000);
 
function Obj(dt) {
  this.dt = dt;  
  var self = this;
 
  this.interval = true;
 
  (function schedule() {    
    setTimeout(function() {
      self.dt = Date.now();
      log();
      if (!self.interval) return;
      schedule();
    }, 5000);
  }());  
}
 
function log(s) {
  console.log(&#039;global.obj %s:&#039;, s || &#039;&#039;);
  console.dir(global.obj);
}
</code></pre></div><p>После выполнения кода test3.js вывод в консоль получился довольно большой, потому как там имеют место циклические ссылки, поэтому целиком его не даю, а после выполнения test4.js все должно завершиться примерно так:<br /><span class="postimg"><img src="http://2.bp.blogspot.com/-0FQ_7wyG0bc/UxRCSrgrZiI/AAAAAAAACZs/Cng_2-3DlJw/s1600/essay2.jpg" alt="http://2.bp.blogspot.com/-0FQ_7wyG0bc/UxRCSrgrZiI/AAAAAAAACZs/Cng_2-3DlJw/s1600/essay2.jpg" /></span></p><p>В общем памятуем об особенностях потока выполнения JavaScript.</p>]]></description>
			<author><![CDATA[null@example.com (dab00)]]></author>
			<pubDate>Mon, 03 Mar 2014 09:41:25 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=80487#p80487</guid>
		</item>
	</channel>
</rss>
