发生了一些奇怪的事情...我有以下功能:
getInviteLink : function() {
var me = this,
invite_url;
$.getJSON('get_invite_code.json', function(data) {
console.log(data.invite_url);
invite_url = data.invite_url;
});
console.log(invite_url)
return invite_url;
},
运行时,第一个控制台日志返回正确的值。但是,在第二个控制台日志上没有任何内容。为什么不能从getJSON函数内部设置invite_url?
由于
答案 0 :(得分:3)
因为getJSON方法是异步的。发生了什么......
getInviteLink : function() { // this function is called...
var me = this,
invite_url; // happens right away
$.getJSON('get_invite_code.json', function(data) {
// Step 2, these statements don't happen until later
// -- when the response is received
console.log(data.invite_url); // this
invite_url = data.invite_url;
}); // Step 1. the getJSON is called right away
console.log(invite_url) // this happens right after the
// the getJSON is called, but before
// it gets a response. Thus no data when the log
// statement is invoked
return invite_url; // also no data (yet) when this return statement
// is executed
},
已添加要修复您的软件,您需要意识到在从服务器收到JSON响应之前,您无法对invite_url
执行任何操作。 - 如果您的客户遇到网络问题或服务器问题,可能永远不会收到。
您可以将函数传递给getJSON调用。该函数将使用invite_url。在此期间,您可以为您的客户做其他事情。
如果您的软件没有任何内容可以做,直到您收到响应,然后设置一个忙碌指示器(一个旋转的圆圈或其他东西),然后启动json请求并让功能在您收到回复时取消忙碌指示。
有关详细信息,请参阅jQuery json文档。
答案 1 :(得分:2)
你不能将invite_url作为返回值在代码中使用getJSON。如果你想使用inviteURL,需要使用回调函数进行重构。
在这种情况下,如果您看到控制台的顺序。它将首先执行invite_url,然后执行data.invite_url。 getJSON的原因是异步调用。为了使这个工作你需要调用get with带有async:false,你不可能需要使用$ .ajax和datatyoe json。以下示例将匹配您所需的内容。
getInviteLink: function() {
var me = this,
invite_url;
$.ajax({
url: 'get_invite_code.json',
dataType: 'json',
async: false,
success: function(data) {
console.log(data.invite_url);
invite_url = data.invite_url;
}
});
console.log(invite_url)
return invite_url;
},
如果返回不是强制性的,我建议重构代码并使用回调函数而不是async false。所以你可以使用getJSON
答案 2 :(得分:1)
确实设置了它,但异步。只有在服务器响应到达后才会调用回调函数。但是,$.getJSON
函数将在发送请求后立即返回,因此在调用回调函数之前,“第二个”console.log将首先实际发生。
您不能编写这样的函数来同步返回异步服务器请求的结果。