Полная ясность, я делаю это в Узле, если это имеет значение.
У меня есть метод, который делает несколько синхронных вызовов (они зависят от обратной связи каждого вызова в следующем, поэтому должны быть синхронными), и я не контролирую окружающую среду или вещи, которые я вызываю.
Мне нужно вернуть значение через заданное время (около 3 секунд), независимо от того, были ли завершены эти вызовы. Если эти вызовы завершены, скрипт завершает работу и возвращает значение. Этакий тайм-аут резервного копирования, который возвращает допустимое (если не полное) значение вместо полного тайм-аута из-за ограничений на выполнение сервера и выдачи ошибки.
Я сразу же думаю использовать setTimeout()
(и clearTimeout()
, если он не сработал) для возврата. Однако возвращение значения в обратном вызове setTimeout не завершает мой сценарий и, очевидно, возвращает это значение - так как бы я?
//"myFunction" being consumed by something I don't have control over
//Otherwise I'd just wrap the caller in a timeout
myFunction = async () => {
var scripttimer = setTimeout(function(){
//emergency exit - script took longer than 3 seconds
return "I need to return a value for myFunction now";
}, 3000);
//multiple synchronous remote https calls are made
//right here which could sometimes cause this function
//to take more than 3 seconds, at which point the
//scripttimer should kill myFunction by making it return
//a value. That's the part that I'm asking how to do, if
//even possible
if (scripttimer){
//if we took less than 3 seconds, we don't need the backup
//callback in scripttimer and so we're going to kill it
clearTimeout(scripttimer);
}
//best scenario return value, script took less than 3 seconds
return "did this anyways";
}
Пытались
Мысль сделать настройку трик-бросок-бросок:
try {
var scripttimer = setTimeout(function(){
throw "I need to return a value for myFunction now";
}, 3000);
//wait 4 seconds maybe
if (scripttimer){
clearTimeout(scripttimer);
}
return "I don't make it out if I take too long";
} catch (e){
return "acceptable enough";
}
... но перехватчик не улавливает его, что имеет смысл, поскольку выбрасываемая ошибка выходит за рамки попытки перехвата, поскольку она асинхронна ... так что пока что моя лучшая идея до сих пор.