Я извлекаю форму (через XMPP, XEP-0004), создавая диалоговое диалоговое диалоговое окно для нее, а затем отправляя форму, когда диалог закрыт.Как использовать обещания в интерактивном вызове?
Код (примерно аппроксимируется для простоты):
function form(name, callback) {
server.getForm(name, function(response) {
callback(response.formFields, function (data) {
server.submitForm(name, data);
});
});
}
function main() {
form('example', function(fields, callback) {
var dialog = ui.formDialog(fields);
dialog.addButton('submit', function(data) {
callback(data);
});
dialog.show();
});
}
Обратите внимание, как вызывающей и вызываемой функции обратного вызова обмена - в одном направлении, для полей, получаемых с сервера; в другом - для предоставленных пользователем данных.
Я недавно открыл JS Promises, и я хотел бы узнать, смогут ли они более элегантно заменить обратные вызовы.
я добрался до:
function form(name) {
return new Promise((resolve, reject) => {
server.getForm(
name,
(response) => { resolve(response.formFields) },
reject
);
});
}
function main() {
form('example').then((fields) => {
var dialog = ui.formDialog(fields);
dialog.addButton('submit', /* ... */);
});
}
Но теперь я застрял, потому что у меня нет способа передать событие кнопку отправки обратно в form()
вызова.
Я не могу просто создать обещание для диалога, потому что мне нужно было бы создать это обещание сначала, чтобы передать его form()
, но мне нужно обещание, возвращенное form()
, которое нужно решить, прежде чем я смогу создать диалог. Там есть проблема с загрузкой.
Есть ли способ использовать обещания здесь, или я должен придерживаться передающих обратных вызовов назад и вперед?