【问题标题】:Returning value from Javascript function when value comes from within a promise当值来自承诺时,从 Javascript 函数返回值
【发布时间】:2014-09-22 21:39:28
【问题描述】:

我正在尝试从异步函数调用中返回一个值,并且我理解,来自诸如 this 之类的帖子,您不能使用返回。但是,这暗示我应该能够通过正确使用回调和承诺来完成此任务。不幸的是,我很难弄清楚如何处理下面的问题。

在这里,我想返回一个从 AJAX 调用获得的 URL 值。

 function getGithubURL(name){
  var ghUserURL = 'https://api.github.com/users/bullcitydave?client_id=-----&client_secret=------';

  var jsPromise = Promise.resolve($.getJSON(ghUserURL));

  var avatar;

  jsPromise.then(function(data) {
      avatar = data.avatar_url;
      console.log(avatar);  // I have the correct value here
    });

  return avatar; // how do I return it correctly?
};

【问题讨论】:

  • 你不能那样做......唯一的解决办法是使用回调方法来处理从promise返回的值
  • 您可以通过将回调函数传递给 getGithubURL 函数来“返回”它,在 jsPromise.then 内部调用它(并将其传递给 data.avatar_url,然后在运行 console.log('The URL for my Github image is',x); 的回调函数内部调用它
  • @benjamin-gruenbaum - 你真的想将此标记为该问题的重复吗?这个问题的症结在于如何使用promises从他的函数中得到一个ajax结果。您将其标记为 dup 的问题涉及他遇到的异步问题,但对如何使用 Promise 解决问题提供零帮助(请参阅我试图解决该问题的答案)。我决定投票重新开放。您将其标记为重复的问题仅解决了该问题的一部分,而不是我认为更有趣的部分。
  • @bullcitydave - 你不能只同步返回值。您将不得不通过回调函数或承诺返回它(这实际上也只是一个回调,但在一个有用的结构中)。我同意 Benjamin 的观点,如果您仍在尝试从同步函数返回异步值,那么您应该阅读 stackoverflow.com/questions/14220321/…,因为这不是 javascript 可以做的事情。另一种方法是强制异步 ajax 调用是同步的,但这通常是一个糟糕的设计决策。

标签: javascript jquery asynchronous return promise


【解决方案1】:

您不能在同步函数中返回从异步操作获取的值。异步操作要到稍后的某个时间才会完成,因此当您的 getGithubURL() 函数返回时它根本不可用。这是时间问题,只是 javascript 无法做到的。

您可以通过调整使用 Promise 的方式来解决您的问题。您要做的是使.then() 处理程序成为最终数据的消费者。这样你就可以通过你的 promise 结构传回数据。您还想利用 $.getJSON() 已经返回的承诺 - 无需在此处创建自己的承诺。

这是一种方法。

getGithubURL("bullcitydave").then(function(url) {
    // you can use the avatar url here
});

function getGithubURL(name){
  var ghUserURL = 'https://api.github.com/users/bullcitydave?client_id=-----&client_secret=------';

  return $.getJSON(ghUserURL).then(function(data) {
      return data.avatar_url;
  });
};

您致电$.getJSON()。它返回一个承诺,您可以在该承诺上添加一个.then() 处理程序,以便提取您想要的实际数据。从.then() 处理程序,您返回所需的最终数据。 $.getJSON().then() 序列创建了一个新的承诺,它是您从 getGithubURL() 函数返回的内容,并且在 getJSON().then() 序列完成之前不会被解析。这会将您的头像 URL 显示给外部 .then() 处理程序,如代码所示 以上。


或者,如果你的 getGithubURL() 函数的调用者不打算使用承诺,那么你可以让你的函数接受这样的回调:

getGithubURL("bullcitydave", function(url) {
    // you can use the avatar url here
});

function getGithubURL(name, fn) {
  var ghUserURL = 'https://api.github.com/users/bullcitydave?client_id=-----&client_secret=------';

  $.getJSON(ghUserURL).then(function(data) {
      // call the callback and pass it the avatar url
      fn(data.avatar_url);
  });
};

【讨论】:

  • @bullcitydave - 为 getGithubURL() 添加了一个简单的回调选项。
  • 感谢您抽出宝贵时间,您的回复给了我宝贵的理解。这对我来说是一个很难解释的问题。似乎无论我走哪条路,我都留下了一个与辅助函数 all 对应的返回值。我真正有一个主要功能将所有这些包装起来,主要功能需要报告结果。因此,如果查看您的最后一个代码 sn-p,想象一个基本的上层函数,其中嵌套了您的所有代码我怎样才能让该代码返回 data.avatar_url?我问的有意义吗?我真的很喜欢这个反馈和...
  • 谢谢@jfriend00,我不怀疑你,我很感激你的反馈。最好的问候!
猜你喜欢
  • 2019-01-23
  • 2020-08-26
  • 2014-07-05
  • 1970-01-01
  • 2020-11-20
  • 2017-04-05
  • 1970-01-01
  • 2016-10-24
相关资源
最近更新 更多