2016-11-09 8 views
0

В настоящее время я использую скрипт для установки тайм-аута в 3 секунды для моей функции перед выполнением следующего действия.js Promise, cancel timeout

function sleep(ms) 
{ 
    return new Promise((resolve) => setTimeout(resolve, ms)); 
} 

sleep(3000).then(function() 
{ 
    // next action 
}); 

Теперь я хочу найти способ закончить 3-секундный таймаут раньше, например. выполнив щелчок мышью. Как я могу это реализовать?

+0

Любая конкретная причина вы используете посылы для этого? Обещания велики, но они не подлежат аннулированию. И 'setTimeout' возвращает идентификатор, который вы можете использовать для отмены ожидающего вызова функции. –

+0

вам нужно очистить таймаут, а затем вызвать преобразователь, если хотите, или просто перейдите. – Dabbas

ответ

1

Что-то вроде этого, возможно?

function sleeper(ms) { 
 
    var r; 
 

 
    var p = new Promise(resolve => { 
 
    r = resolve; 
 
    setTimeout(resolve, ms); 
 
    }); 
 

 
    return { 
 
    skip: r, 
 
    promise: p 
 
    }; 
 
} 
 

 
var s = sleeper(10000); 
 

 
s.promise.then(() => { 
 
    console.log('Promise finished!'); 
 
}); 
 

 
console.log('Waiting for 10 seconds... Click the button to skip the wait.'); 
 

 
document.getElementById('skip').addEventListener('click', s.skip);
<input type="button" id="skip" value="Skip delay" />

+0

s2 обещание будет разрешено, даже если вы его пропустили, потому что вы не отменили его тайм-аут – Dabbas

+0

@Dabbas Это должно быть разрешено. Я не думаю, что здесь есть проблема. – JLRishe

+0

в предыдущем коде (перед редактированием) второе обещание, даже если я пропустил его и не вызвал его снова. – Dabbas

0

Как идея, может быть, вы можете сделать это:

var timeout, myResolver; 
function sleep(ms) 
{ 
    return new Promise((resolve) => { 
      myResolver = resolve; 
      timeout = setTimeout(resolve, ms); 
     }); 
} 

sleep(3000).then(function() 
{ 
    // next action 
}); 
function myStopFunction() { 
    clearTimeout(timeout); 
    myResolver(); 
}