Javascript 从函数内部所需的数据填充空对象?
只是想用get请求中的数据填充Javascript 从函数内部所需的数据填充空对象?,javascript,jquery,Javascript,Jquery,只是想用get请求中的数据填充myObj。根据我的console.log(myObj)的说法,一切似乎都是他们的,但无法访问。我相信他们的答案很简单。谢谢 function getInfo() { var myObj = {}; $.get("http://ipinfo.io", function(response) { myObj.city = response.city; myObj.region = response.region; }, "jsonp");
myObj
。根据我的console.log(myObj)的说法,一切似乎都是他们的,但无法访问。我相信他们的答案很简单。谢谢
function getInfo() {
var myObj = {};
$.get("http://ipinfo.io", function(response) {
myObj.city = response.city;
myObj.region = response.region;
}, "jsonp");
console.log(myObj.city); //undefined
return myObj;
}
var myStuff = getInfo(); //Object {} just as I expected obviously.
console.log(myStuff) // Object shows all my key value pairs but -->
console.log(myStuff.city); // undefined why?
更适合使用承诺。您可以尝试以下方法:
function getInfo() {
var dfd = $.Deferred();
$.get("http://ipinfo.io", function(response) {
myObj.city = response.city;
myObj.region = response.region;
dfd.resolve(myObj);
}, "jsonp");
// Return the Promise so caller can't change the Deferred
return dfd.promise();
}
getInfo().done(function(myStuff) {
console.log(myStuff);
console.log(myStuff.city);
});
有了承诺,代码是一个优雅的想法 更适合使用承诺。您可以尝试以下方法:
function getInfo() {
var dfd = $.Deferred();
$.get("http://ipinfo.io", function(response) {
myObj.city = response.city;
myObj.region = response.region;
dfd.resolve(myObj);
}, "jsonp");
// Return the Promise so caller can't change the Deferred
return dfd.promise();
}
getInfo().done(function(myStuff) {
console.log(myStuff);
console.log(myStuff.city);
});
有了承诺,代码是一个优雅的想法 它返回未定义,因为请求尚未响应,然后函数返回值。您的请求是异步的,这意味着您的函数不会等待get请求。它将返回myObj所拥有的一切 你可以试试类似的东西
function getInfo(callback){
$.get(..., function(res){
var myObj = …;
callback(myObj);
}
}
当您的请求完成时,它将调用回调函数并传入myObj。因此,您需要传入一个匿名函数,该函数期望从响应传入一个myObj参数
getInfo(function(data){
//data should be myObj
});
它返回undefine,因为请求尚未响应,然后函数返回值。您的请求是异步的,这意味着您的函数不会等待get请求。它将返回myObj所拥有的一切 你可以试试类似的东西
function getInfo(callback){
$.get(..., function(res){
var myObj = …;
callback(myObj);
}
}
当您的请求完成时,它将调用回调函数并传入myObj。因此,您需要传入一个匿名函数,该函数期望从响应传入一个myObj参数
getInfo(function(data){
//data should be myObj
});
$.get
是一个异步操作,这意味着它会立即返回(无需先在回调函数中运行代码)。只有在将来GET请求完成时,才会执行回调。同时,将执行$.get
调用后面的代码
您看到的是特定执行顺序的结果,其中GET请求在执行以下代码之前没有完成。换言之,你有一个好的选择
理论上,如果GET请求几乎立即完成,则回调可能会在日志语句之前执行,因此不会打印undefined
。但是,这不太可能,因为执行日志指令所需的时间比执行GET请求所需的时间要少得多
要解决此问题,您需要确保您的日志语句始终仅在GET请求完成后运行。在JS中实现这一点的惯用方法是回调-例如,传递一个包含要执行的代码的函数,并从响应处理程序内部调用它:
function getInfo(callback) {
var myObj = {};
$.get("http://ipinfo.io", function(response) {
myObj.city = response.city;
myObj.region = response.region;
callback(myObj);
}, "jsonp");
console.log(myObj.city); //undefined
}
getInfo(function(myStuff) {
console.log(myStuff)
console.log(myStuff.city);
});
$.get
是一个异步操作,这意味着它会立即返回(无需先在回调函数中运行代码)。只有在将来GET请求完成时,才会执行回调。同时,将执行$.get
调用后面的代码
您看到的是特定执行顺序的结果,其中GET请求在执行以下代码之前没有完成。换言之,你有一个好的选择
理论上,如果GET请求几乎立即完成,则回调可能会在日志语句之前执行,因此不会打印undefined
。但是,这不太可能,因为执行日志指令所需的时间比执行GET请求所需的时间要少得多
要解决此问题,您需要确保您的日志语句始终仅在GET请求完成后运行。在JS中实现这一点的惯用方法是回调-例如,传递一个包含要执行的代码的函数,并从响应处理程序内部调用它:
function getInfo(callback) {
var myObj = {};
$.get("http://ipinfo.io", function(response) {
myObj.city = response.city;
myObj.region = response.region;
callback(myObj);
}, "jsonp");
console.log(myObj.city); //undefined
}
getInfo(function(myStuff) {
console.log(myStuff)
console.log(myStuff.city);
});
阅读“回调/事件驱动编程”和“异步”<代码>响应仅在回调函数中可用。你的其他逻辑应该从那里调用。可能重复欢迎来到回调世界。在你了解它之前,你会有更深层次的了解。感谢各位,我所做的普通JavaScript主要是设计而已,我读了一些Rudie的文章。竖起大拇指。阅读“回调/事件驱动编程”和“异步”<代码>响应仅在回调函数中可用。你的其他逻辑应该从那里调用。可能重复欢迎来到回调世界。在你了解它之前,你会有更深层次的了解。感谢各位,我所做的普通JavaScript主要是设计而已,我读了一些Rudie的文章。竖起大拇指。感谢您的解释,我在阅读了有关回调的内容后,它开始工作了。谢谢,不用客气。鲁迪说得对。我只是详细阐述了他的回答。感谢你的解释,我在阅读了关于回调的内容后才开始工作。谢谢,不用客气。鲁迪说得对。我只是对他的回答作了详细的阐述。