HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
параметр DelayBeforeAcceptance.
let lastRequested = new Date()
if (new Date() - lastRequested > 1000 * 60 * 30) { // 1000 мс * 60 сек * 30 мин
lastRequested = new Date()
// тут запрос
//
// а еще лучше обновить lastRequested = new Date()
// когда запрос вернется успешно
// чтобы в случае провала его можно было повторить быстрее чем через полчаса
}
pointer-events: none
, чтобы не перекрывался доступ к контенту. import { interval } from 'rxjs';
import { switchMap } from 'rxjs/operators';
const requests$ = interval(300).pipe(
switchMap(() => http.get('path'))
)
Приноровился к angular 2+
if (this.scrollHeight - this.scrollTop === this.clientHeight) {
alert('This is the End');
}
if (window.devicePixelRatio !== 1) { // Костыль для определения иных устройств, с коэффициентом отличным от 1
var dpt = window.devicePixelRatio;
var widthM = window.screen.width * dpt;
var widthH = window.screen.height * dpt;
document.write('<meta name="viewport" content="width=' + widthM+ ', height=' + widthH + '">');
}
static uv_sem_t sem;
uv_work_t *baton;
void work(uv_work_t* task) {}
void after(uv_work_t* task, int status) {
printf("after\n");
delete task;
uv_sem_post(&sem);
}
int process()
{
baton = new uv_work_t();
if (uv_sem_init(&sem, 0) < 0) {
perror("uv_sem_init");
return -1;
}
uv_queue_work(uv_default_loop(), baton, work, after);
printf("before\n");
uv_sem_wait(&sem);
uv_sem_destroy(&sem);
return 0;
}
uv_work_t *baton;
void work(uv_work_t* task) {}
void after(uv_work_t* task, int status) {
HandleScope scope;
int n = *((int*)(&task->data));
const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value>::New( Number::New(n) ) };
processCallback->Call(Context::GetCurrent()->Global(), argc, argv);
scope.Close(Undefined());
delete task;
}
int process()
{
baton = new uv_work_t();
baton->data = (void*)123;
uv_queue_work(uv_default_loop(), baton, work, after);
return 0;
}