延續(同步和非同步)
回撥可用於提供方法完成後要執行的程式碼:
/**
* @arg {Function} then continuation callback
*/
function doSomething(then) {
console.log('Doing something');
then();
}
// Do something, then execute callback to log 'done'
doSomething(function () {
console.log('Done');
});
console.log('Doing something else');
// Outputs:
// "Doing something"
// "Done"
// "Doing something else"
上面的 doSomething()
方法與回撥同步執行 - 執行塊直到 doSomething()
返回,確保在直譯器移動之前執行回撥。
回撥也可用於非同步執行程式碼:
doSomethingAsync(then) {
setTimeout(then, 1000);
console.log('Doing something asynchronously');
}
doSomethingAsync(function() {
console.log('Done');
});
console.log('Doing something else');
// Outputs:
// "Doing something asynchronously"
// "Doing something else"
// "Done"
then
回撥被認為是 doSomething()
方法的延續。提供回撥作為函式中的最後一條指令稱為尾呼叫 ,由 ES2015 直譯器優化 。