Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从函数内部所需的数据填充空对象?_Javascript_Jquery - Fatal编程技术网

Javascript 从函数内部所需的数据填充空对象?

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");

只是想用get请求中的数据填充
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的文章。竖起大拇指。感谢您的解释,我在阅读了有关回调的内容后,它开始工作了。谢谢,不用客气。鲁迪说得对。我只是详细阐述了他的回答。感谢你的解释,我在阅读了关于回调的内容后才开始工作。谢谢,不用客气。鲁迪说得对。我只是对他的回答作了详细的阐述。