发出访问函数范围之外的变量

时间:2016-03-16 01:43:51

标签: javascript jquery scope

我从XML Feed中提取数据。这一切都正常,但我需要在函数外部productIDs

    // Get feed data
    $.get('example-feed.xml', function (data) {

    var $xml = $(data);

    // Collect array of product IDs
    var productIDs = [];

    // extract ids from xml
    $xml.find("item").each(function() {

      var $this = $(this)

      item = {
        id: $this.find("id").text()
      }

      // get the id
      var itemID = item.id;

      // push ids to array
      productIDs.push(itemID);

    });

    console.log(productIDs); // Works as expected

  });

  console.log(productIDs); // Undefined, also as expected 

如何调整我的功能?

    example = function(){

      var productIDs = "my content ids"

      return {'productIDs': productIDs}

    }

    var retrive = example();

    console.log(retrive.productIDs);

1 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点,但最好的方法是使用promises,因为JQuery的get通常是异步函数,你必须等待它的完成才能获得产品id

你可以这样做

function fetchThings () {
  return new Promise(function (yes, no) {
    $.get('example-feed.xml', function (data) {

      // some code here

      console.log(productIDs); // Works as expected
      yes(productIDs);
    });
  });
}

fetchThings().then(function (productIDs) {
   // do stuff with prodcut ids here
});

另一种方法是让$ .get调用同步,所以用

替换它
var productIDs;
$.ajax({url: 'example-feed.xml', type: "GET", async: false, success: function (data) { 
// process productIDs here
}});

// use productIDs here

更新

这是一段异步ajax,点击运行检查

var postIDs;

$.ajax({
  url: 'http://jsonplaceholder.typicode.com/posts',
  method: 'GET',
  async: false,
  success: function(posts) {
    postIDs = posts.map(function (p) { return p.id; });
  }
});

document.write(JSON.stringify(postIDs));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>