2016-11-09 53 views
0

當前我正在使用腳本爲我的函數設置超時3秒,然後執行下一個操作。js Promise,取消超時

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

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

現在我想找到一種方法來提前結束3秒超時,通過執行鼠標點擊。我將如何去實施這個?

+0

你用承諾這有什麼特別的原因嗎?承諾是偉大的,但它們不可取消。 'setTimeout'返回一個ID,您可以使用它來取消即將進行的函數調用。 –

+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(); 
}