Показать сообщение отдельно
  #2 (permalink)  
Старый 03.04.2011, 12:13
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

function work(options){

/*
      {  FUNC callback [,INT time]  [, STR type] [, STR || ARR args] }
      понятно ? :)
*/


// аргумент должен быть один - OBJ или ARR
if(arguments.length !== 1)  throw(new Error('Undefined Arguments'));

// если это массив (у хеша нет длины), то делаем то что надо ..  *!*в [ [scope] ] window*/!*
if( !!options.length  ) {  options[0].apply(window,options[1]);return; }

// без функции, которую надо исполнить ( колбек ) , не работаем 
if( !options.callback )  throw(new Error('I need Callback!'));

// одновременно подставляем строку в аргументы колбека, если они не указаны. И, если это не массив (надо массив), то преобразуем в массив. *!* тут будет баг, если аргументы будут хешем.( args:{a:'a',b:"b"} ) */!*
if( (options.args=options.args||'').constructor.toString().indexOf("Array") == -1 ) options.args = [ options.args ];

// коэффициент, т.к. setTimeout требует время в милисекундах
var k = 1000;

switch(options.type){
  
  case'minute': k *= 60;  
  break;

  case'hour': k *= 3600; // 60*60
  break;

  case'day' : k *= 86400; // 60*60*24
  break;

  // если не указан, то остается тысячей. я убрал default
}

/* если время не указано, то оно будет 1 секундой , умноженной на коэф.
   заметим, что функции передается уже массив
*/
setTimeout( function(){ work( [  options.callback, options.args  ]  ); } , (options.time||1)*k );

}



work( { time:3, callback: alert  } )

work( { time:7, callback: alert, args : "Callback number two"  } )

work( { time:1, callback: alert, args: { a:'a',b:'b'  }  } ) // демонстрация бага. хотя.. если сделать alert({ a:'a',b:'b'  }), то будет то же самое!

// кстати, как вы думаете, в каком порядке будут исполнены функции?

alert({ a:'a',b:'b'  })

Последний раз редактировалось melky, 03.04.2011 в 12:24.
Ответить с цитированием