Для общего ознакомления вы должны прочитать Как мне вернуться ответ от асинхронного вызова?. Это описывает общую проблему получения асинхронного результата. Прочитав это, вы, надеюсь, поймете, почему нельзя просто вернуть значение из .onload()
и ожидать, что это будет возвращаемое значение из getMeta()
. Но этот ответ сам по себе не предлагает полного решения вашей конкретной проблемы.
Итак, теперь давайте немного подробнее опишем, что происходит в вашем коде, а затем обсудим вариант исправления.
img.onload
является асинхронным. Это означает, что он когда-то заканчивается, спустя много времени после того, как getMeta()
уже вернулся.
Между тем, вы пытаетесь сделать это:
onsubmit="return getMeta();"
Это выглядит так, как будто вы пытаетесь использовать асинхронный результат, чтобы определить, должна ли форма отправляться или нет. Это просто не может быть сделано таким образом. Асинхронный результат еще не известен, и ваша функция getMeta()
всегда возвращает true
.
Вы можете реструктурировать свой код, чтобы он никогда не отправлялся синхронно. Вы загружаете изображение, и только когда изображение загружается, вы либо показываете ошибку пользователю, либо вручную отправляете форму. У этого есть потенциальные проблемы с пользовательским интерфейсом, потому что пользователь нажимает кнопку отправки, и ничего не происходит немедленно (потому что вы загружаете изображение для проверки). Это заставляет пользователя задуматься о том, что происходит. Они часто думают, что это не сработало, и либо снова нажимают кнопку отправки, либо думают, что это просто сломано. Таким образом, вам обычно требуется куча пользовательского интерфейса вокруг этого, чтобы отключить кнопку, предоставить обратную связь о том, что вы проверяете изображение сейчас, а затем предоставить соответствующее сообщение об ошибке, если изображение не проверяется, и часто другие элементы пользовательского интерфейса должны быть отключены, пока вы вы проверяете изображение, чтобы пользователь не отвлекался и не занимался другими делами, пока вы пытаетесь решить, собираетесь ли вы отправить эту форму или нет.
Итак, чтобы исправить отправку:
В вашем обработчике onsubmit вы всегда будете возвращать false
, чтобы форма никогда не отправлялась немедленно. Затем в обработчике onload()
(после загрузки изображения) вы вручную отправляете форму или показываете ошибку.
person
jfriend00
schedule
24.04.2016
.onload
является асинхронным, что означает, что он вызывается системой когда-то в будущем, и любое значение, которое вы возвращаете из него, просто возвращается в систему, а не в ваш собственный код. - person jfriend00   schedule 24.04.2016