【问题标题】:Does this JavaScript function need to return a Promise?这个 JavaScript 函数是否需要返回一个 Promise?
【发布时间】:2014-10-06 13:38:38
【问题描述】:

假设我有一些 JS 可以像这样进行 AJAX 调用:

$.getJSON(myUrl, { targetState: state }, function (jsonData) {
}).success(function (jsonData) {
    ...
    ...
    ...
});

现在让我们假设我想将此代码包装在一个函数中并让它在成功块中返回一些值,这样我就可以从我的应用程序的各个位置调用它。我创建的函数是否应该返回一个 Promise?我想它可能会,但我从未创建过返回 Promise 的 JS 函数,所以我不完全确定何时需要这样做。

【问题讨论】:

  • $.getJSON 返回实现 Promise 接口的 jqXHR 对象。所以你可以只返回$.getJSON 调用的结果。

标签: javascript promise jquery-deferred


【解决方案1】:

我创建的函数是否应该返回一个 Promise

是的。如果您想使用 Promise,每个 异步执行任何操作的函数都应该为其结果返回一个 Promise。真的没有例外。

将此代码包装在一个函数中并让它在成功块中返回一些值

好消息:这并不复杂,因为$.getJSON 已经承诺与您合作。现在你需要做的就是使用then method - 你可以传递一个回调来对结果做一些事情,并为回调的返回值取回一个新的承诺。您只需将您的success 替换为then,并添加一些returns:

function target(state) {
    var myUrl = …;
    return $.getJSON(myUrl, { targetState: state })
//  ^^^^^^
    .then(function (jsonData) {
//   ^^^^
        /* Do something with jsonData */
        return …;
//      ^^^^^^
    });
}

有了 Promise,您不再需要向 $.getJSON 函数传递回调。

所以我可以从我的应用程序的不同位置调用它

现在,您可以调用 target 函数,并在另一个回调中获取返回的 Promise 的结果:

target({…}).then(function(result) {
    …; return …;
});

【讨论】:

  • 您可能还对使用 Promise 的 these general rules 感兴趣。
  • 通过将then 链接到target 函数可以从外部使用它可能是有益的。
  • @BenjaminGruenbaum:[X] 完成
  • 好吧,我不能投票两次 :P 我认为告诉人们使用情况确实很有帮助。
  • 太棒了!谢谢你这样做。我希望我能对此投票 10 次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2020-09-30
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多