我正在檢索表單(通過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()
返回的承諾對話框。有一種引導問題。
有沒有某種方法可以在這裏使用promise,或者我應該堅持傳遞迴調嗎?