Следуйте структуре других API в JavaScript: пусть ваша функция clip также принимает функцию «что делать дальше». (Более технический термин: «обратный вызов»). Идея состоит в том, что ваша функция клипа знает, когда она закончит свою работу, и затем может вызвать обратный вызов в нужное время.
В качестве примера, скажем, у нас есть функция, которая будет медленно произносить слово в теле документа:
var spell = function(word, onSuccess) {
var i = 0;
var intervalId = setInterval(function() {
if (i >= word.length) {
clearInterval(intervalId);
onSuccess();
} else {
document.body.appendChild(
document.createTextNode(word.charAt(i)));
i++;
}
}, 100)
};
Когда это вычисление завершит написание слова, оно вызовет onSuccess , который будет нашим обратным вызовом. Когда у нас есть spell () , мы можем попытаться использовать его:
var startIt = function() {
spell("hello", afterHello);
};
var afterHello = function() {
spell("world", afterHelloWorld);
};
var afterHelloWorld = function() {
alert("all done!");
};
Попробуйте позвонить startIt , и вы увидите, что он делает свое дело.
Этот подход позволяет нам связать воедино эти асинхронные вычисления. Каждый хороший JavaScript-асинхронный API позволяет вам определять, «что делать дальше» после успешного вычисления. Вы можете написать свои собственные функции, чтобы сделать то же самое.