当值来自承诺时,从Javascript函数返回值

当值来自承诺时,从Javascript函数返回值,javascript,jquery,asynchronous,return,promise,Javascript,Jquery,Asynchronous,Return,Promise,我试图从异步函数调用中返回一个值,我理解,从诸如不能使用返回的帖子中。然而,这意味着我应该能够通过恰当地使用回调和承诺来实现这一点。不幸的是,我很难弄清楚如何处理下面的问题 这里,我想返回一个从AJAX调用中获得的URL值 function getGithubURL(name){ var ghUserURL = 'https://api.github.com/users/bullcitydave?client_id=-----&client_secret=------'; v

我试图从异步函数调用中返回一个值,我理解,从诸如不能使用返回的帖子中。然而,这意味着我应该能够通过恰当地使用回调和承诺来实现这一点。不幸的是,我很难弄清楚如何处理下面的问题

这里,我想返回一个从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?
};

不能在同步函数中返回从异步操作获取的值。异步操作要过一段时间才能完成,因此当
getGithubURL()
函数返回时,它还不可用。这是一个时间问题,也是javascript无法做到的

你可以通过重组你如何使用承诺来解决你的问题。您要做的是使
.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()序列完成之前不会解析。这将向外部
.then()
处理程序显示您的化身URL,如代码所示 上面


或者,如果
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);
  });
};

你不能那样做。。。唯一的解决方案是使用回调方法来处理从promise返回的值。您可以通过将回调函数传递给
getGithubURL
函数来“返回”它,在
jsPromise内调用该函数。然后
(并将
数据.avatar\u url
传递给它,并在该回调内运行
console.log('我的Github图像的URL是',x)
@benjamin gruenbaum-你真的想把这个问题标记为那个问题的一个dup吗?这个问题的关键是如何使用承诺从他的函数中获得ajax结果的一部分。你标记这个dup的问题处理了他所遇到的异步问题,但对于如何使用承诺来解决这个问题没有任何帮助(请参阅我试图解决的问题的答案)。我决定投票重新打开。您标记为dup of的问题只解决了这个问题的一部分,而不是我认为更有趣的部分。@bullcitydave-您不能同步返回值。您必须通过回调函数或承诺返回它(这实际上也只是一个回调,但在一个有用的结构中)。我同意Benjamin的观点,如果您仍然试图从同步函数返回异步值,那么您应该阅读,因为javascript无法做到这一点。另一种方法是强制异步ajax调用同步,但这通常是一个错误的设计决策。@bullcitydave-为
getGithubURL()
。感谢您的时间和回复,让我有了宝贵的理解。这对我来说是一个很难解释的问题。似乎无论我走哪条路,我都会得到一个对应于辅助函数all的返回值。我真正拥有的是一个主函数,它将所有这些都包装起来,并且主函数需要重新设置移植结果。因此,如果查看您的上一个代码片段,想象一个基本的更高层次的函数,其中嵌套了您的所有代码。如何让代码返回数据。avatar_url?我所问的有意义吗?我真的很欣赏这个反馈,并且…谢谢@jfriend00,我不怀疑您,我感谢您的反馈。致以最诚挚的问候!