当值来自承诺时,从Javascript函数返回值
我试图从异步函数调用中返回一个值,我理解,从诸如不能使用返回的帖子中。然而,这意味着我应该能够通过恰当地使用回调和承诺来实现这一点。不幸的是,我很难弄清楚如何处理下面的问题 这里,我想返回一个从AJAX调用中获得的URL值当值来自承诺时,从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
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,我不怀疑您,我感谢您的反馈。致以最诚挚的问候!