如何在互动电话中使用承诺?

时间:2016-04-18 19:56:57

标签: javascript promise es6-promise

我正在检索表单(通过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()来电。

我也不能简单地为对话创建一个Promise,因为我必须首先创建该promise才能将其传递给form(),但我需要form()返回的承诺。在我可以创建对话框之前要解决{1}}。这有一种引导问题。

有没有办法在这里使用promises,还是我应该坚持回传传递回调?

3 个答案:

答案 0 :(得分:2)

您可以将问题分成三个部分:

  1. form - 检索表单 - 获取名称的函数,并返回使用字段解析的Promise。
  2. askUser - 收集输入 - 获取字段,显示表单并返回带有提交数据的Promise的函数。
  3. submit - 提交表单 - 获取数据并返回网络结果承诺的函数。
  4. 你可以将三者组合在一起:

    form('example')
      .then(askUser)
      .then(submit)
      .catch(errorHandler)
    

    哪会返回Promise最终通过提交操作解决。

答案 1 :(得分:1)

您仍然可以在响应中传递回调。只需将响应和回调数组传递给resolve即可。在.then回调中,您可能会破坏数组。简而言之,您可以编写类似:response => resolve([response.formFields, **your_callback**]).then(([fields, callback]) ...的内容。但在我看来,代码很臭,你应该将from函数分解为两个独立的函数,以避免来回传递回调

答案 2 :(得分:1)

lead在回调中包含其行为,如果不将lag拆分为两个函数,则无法真正避免该回调。但是,它完全没问题 - 它被称为disposer pattern

您可以这样使用它:

form