Вопрос был:
Как вернуть ответ от асинхронного вызова?
, который может быть интерпретирован как:
Как сделать синхронный асинхронный код синхронным?
Решение будет состоять в том, чтобы избежать обратных вызовов и использовать комбинацию Promises и async / await.
Я хотел бы привести пример для запроса Ajax.
(Хотя он может быть записан в Javascript, я предпочитаю писать его на Python и компилировать его в Javascript, используя Transcrypt . Это будет достаточно ясно.)
Позволяет сначала включить использование JQuery, чтобы
$
был доступен какS
:__pragma__ ('alias', 'S', '$')
Определить функцию, которая возвращает Promise, в этом случае вызов Ajax:
def read(url: str): deferred = S.Deferred() S.ajax({'type': "POST", 'url': url, 'data': { }, 'success': lambda d: deferred.resolve(d), 'error': lambda e: deferred.reject(e) }) return deferred.promise()
Использовать асинхронный код, как если бы он был синхронным:
async def readALot(): try: result1 = await read("url_1") result2 = await read("url_2") except Exception: console.warn("Reading a lot failed")
submit не является функцией
blockquote>означает, что вы назвали вашу кнопку отправки или какой-либо другой элемент
submit
. Переименуйте кнопку вbtnSubmit
, и ваш звонок будет волшебным образом работать.Когда вы называете кнопку submit, вы переопределяете функцию
submit()
в форме.
, давая элементу формы имя submit, будет просто теневое свойство submit. убедитесь, что у вас нет элемента формы с именем submit, и вы должны иметь доступ к функции отправки просто отлично.
<form action="product.php" method="post" name="frmProduct" id="frmProduct" enctype="multipart/form-data">
<input id="submit_value" type="button" name="submit_value" value="">
</form>
<script type="text/javascript">
document.getElementById("submit_value").onclick = submitAction;
function submitAction()
{
document.getElementById("frmProduct").submit();
return false;
}
</script>
EDIT: я случайно поменял идентификатор вокруг
Вы можете попробовать
<form action="product.php" method="get" name="frmProduct" id="frmProduct" enctype="multipart/form-data">
<input onclick="submitAction(this)" id="submit_value" type="button" name="submit_value" value="">
</form>
<script type="text/javascript">
function submitAction(element)
{
element.form.submit();
}
</script>
У вас нет более одной формы с тем же именем?
Убедитесь, что нет другой формы с тем же именем и убедитесь, что в форме нет имени = "submit" или id = "submit".
Использовать getElementById:
document.getElementById ('frmProduct').submit ()
В этой теме уже много ответов, но тот, который лучше всего работал (и простейший - одна строка!) для меня, был модификацией комментария Нила Э. Пирсона от 21 апреля 2013 года:
< blockquote>Если вы застряли в своей кнопке отправки #submit, вы можете обойти ее, украв другой метод экземпляра экземпляра формы ().
blockquote>Мое изменение в его методе, и что сработало для меня:
document.createElement('form').submit.call(document.getElementById(frmProduct));
Решение для меня заключалось в том, чтобы установить атрибут «form» кнопки
<form id="form_id_name"><button name="btnSubmit" form="form_id_name" /></form>
или js:
YOURFORMOBJ.getElementsByTagName("button")[0].setAttribute("form", "form_id_name");
YOURFORMOBJ.submit();
У меня была такая же проблема, когда я создавал приложение MVC, используя мастер-страницы. Пробовал искать элемент с 'submit' как имена, упомянутые выше, но это было не так.
В моем случае он создал несколько тегов на моей странице, поэтому возникли некоторые проблемы, ссылающиеся на правильную форму.
Чтобы обойти это, я позволю кнопке дескриптор, который будет использовать объект формы :
onclick="return SubmitForm(this.form)"
и с js:
function SubmitForm(frm) {
frm.submit();
}
Возможные решения - 1. Убедитесь, что у вас нет другого элемента с именем / id как submit. 2. Попробуйте вызвать функцию как onClick = "return submitAction();"
3. document.getElementById("form-name").submit();
Я использовал
var enviar = document.getElementById("enviar");
enviar.type = "submit";
Просто потому, что все остальное не работало.
Если у вас нет возможности изменить name="submit"
, вы также можете отправить форму следующим образом:
function submitForm(form) {
var submitFormFunction = Object.getPrototypeOf(form).submit;
submitFormFunction.call(form);
}