ОБНОВЛЕНИЕ 2:
Если оба процесса используют один и тот же URL ресурса, вы можете отправить метаданные в виде пользовательских заголовков HTTP. Хотя я не совсем уверен в следующем методе.
- Вы отправляете запрос Ajax на URL изображения. Это позволит вам читать заголовки ответа HTTP.
- Когда вызов Ajax завершен, вставьте в DOM изображение с тем же URL-адресом, что и в вызове Ajax.
- Теперь это непроверенная часть. Если браузер не делает различий между запросами, инициированными объектом XMLHttpRequest или объектом IMG, то при вставке изображения не будет дополнительного запроса. Это было бы решение в браузере. Кэширующий прокси-сервер гарантирует, что другие клиенты, запрашивающие тот же ресурс, получат кэшированную версию URL.
В любом случае, даже если механизм браузера не работает, по крайней мере, у кэширующего прокси есть шанс кешировать один ответ вместо того, что в противном случае было бы двумя.
Также , хотя вы сказали, что не хотите использовать изображения в кодировке base64, существуют методы , позволяющие определить, поддерживает ли их браузер или нет. Затем вы можете использовать их для достаточно умных браузеров и пожертвовать двойным запросом для других. По крайней мере, не хуже.
ОБНОВЛЕНИЕ 1 (больше не применяется):
Если вы уже используете кеширующий прокси и заголовок max-age, то я бы сделал следующее:
- Инициируйте запрос Ajax для получения метаданных. Метаданные будут содержать URL изображения.
- Вставьте в DOM новое изображение с указанным выше URL.
- Пусть браузер решит, извлекать ли этот ресурс изображения (он может извлечь его из кэша браузера). Этот механизм должен быть таким же, как в обычном случае, когда вы выводите тег IMG с сервера.
- Если вы хотите отображать метаданные только после загрузки изображения, используйте событие onload объекта Image. Также есть событие ошибки.
СТАРЫЙ ОТВЕТ (больше не применяется):
Я не совсем понимаю, что вы подразумеваете под "созданием изображения", но я предполагаю, что вы просто хотите отправить URL-адрес изображения обратно на веб-страницу. В этом случае вы можете использовать JSON для отправки как URL-адреса изображения, так и метаданных. Как это:
{
"url" : "http://example.com/image.png",
"meta" : {
"type" : "png",
"width" : "200px",
"height" : "200px"
}
}
Вы отправляете этот ответ, как только две операции на стороне сервера будут выполнены. Вы инициируете оба с помощью одного Ajax-запроса и получаете ответ для URL-адреса изображения и метаданных одновременно. Затем на стороне клиента вы очень легко их читаете:
var response = eval(xhr.responseText);
var url = response.url;
var imageType = response.meta.type;
Вышеуказанное может произойти внутри обработчика onreadystatechange. Если вы используете библиотеку, все будет немного проще.