<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; JavaScript. Небольшой этюд на тему неблокирующего кода]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=9315&amp;type=atom" />
	<updated>2014-03-03T09:41:25Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=9315</id>
		<entry>
			<title type="html"><![CDATA[JavaScript. Небольшой этюд на тему неблокирующего кода]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=80487#p80487" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2014-03-03T09:41:25Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=80487#p80487</id>
		</entry>
</feed>
