Иногда вы хотите использовать один и тот же обещанный объект в несколько раз и в разных местах. Такие, как обещание для ресурса AJAX из URL.Как выполнить обещания кэширования при работе с новым API-интерфейсом?
Трудно кэшировать объект, потому что вы не знаете, когда он будет асинхронно доступен.
Это нормально, потому что вы можете использовать call .then()
multiple times on a single promise, чтобы вы его кэшировали в первый раз, когда вам это нужно, и получите доступ к кешу в последующие моменты времени. И когда он будет доступен, все .then
s будут выполнены.
Но когда обещание от the new fetch API, похоже, это не так просто ... потому что второе обещание связано.
fetch()
сам возвращает обещание, и когда оно выполнено, вы должны получить доступ к телу ответа HTTP через второе обещание с использованием метода, такого как .blob()
или .json()
. Они входят в состав "Body mixin".
Vanilla пример того, как использовать fetch()
:
fetch(url).then(function(resp) {
return resp.json().then(function(json) {
// use the JSON
});
});
проблемы в том, что даже если вы можете назвать .then()
несколько раз, вы не можете вызов функции, такие как .blob()
и .json()
несколько раз на один ответ.
Похоже, что результат .json()
и т. Д. Также необходимо будет кэшировать, но это должно быть сложнее, поскольку он будет доступен только асинхронно. Ресурс может быть запрошен дважды до того, как будут решены два асинхронных обещания - состояние гонки.
Я что-то упустил? Есть ли простой способ кэшировать JSON с обещаниями и т.д., чем я не вижу? Кажется, я не могу найти это в сети.
Есть ли причина, по которой вы не можете использовать переменную для ее хранения? – ReX357
Где и когда переменная станет доступной с учетом асинхронности? – hippietrail
Неясно, в какой области вам необходимо использовать эту переменную. Внутри вашего блока после вызова выборки вы можете определить переменную над оператором return и назначить ее в первом блоке указанного оператора return. Затем последующий оператор возврата внутри одного блока выборки мог получить доступ к содержимому этой переменной. Но еще раз, ваш вопрос был неясно, когда нужно получить доступ к этим кеш-результатам. Если это выходит за запрос на выборку и любую последующую цепочку, укажите, пожалуйста, так. – ReX357