2

Как вернуть значение переменной name во втором $.get?

Вызываю ф-ю таким образом:

var all = Price(url);

При этом all - пустая.

function Price(url) {

    var res = null;

    $.get(url, function(data){

        var pattern = /"market_hash_name":"(.*?)"/;

        var match = data.match(pattern);

        var name = match[1];

        $('#wrapper').html('name = ' + encodeURIComponent(name));

        if (name) {

            var url2 = 'http://steamcommunity.com/market/priceoverview/?currency=5&appid=730&market_hash_name=' + encodeURIComponent(name);                 

            $.get(url2, function(data){

                var pattern = /"lowest_price":"(.*?)"/;

                var match = data.match(pattern);

                var name = match[1].split('p')[0];

                $('#w').html(name);

                res = name;

            }, "html");

        }   

    }, "html");

  return res;   

}

Код, где вызывается ф-я:

for (var i = 0; i < whil.size(); i++) {

  $('.primary:last', data).children('.tradeoffer_item_list').children('.trade_item').each(function(i) {

    one.push($(this).attr("data-economy-item").split('/')[2]);
    two.push($(this).attr("data-economy-item").split('/')[3]);

  });

  Price("http://steamcommunity.com/economy/itemhover/730/2/" + one[i] + "?o=" + two[i], function(res) {
    all += res;
  });

}

$('#w').html(all);
Peter Olson
  • 10,462

1 Answers1

2

Дело в том, что res - результат от асинхронной функции. Невозможно вернуть такие результаты просто так; надо использовать функцию callback.

function Price(url, callback) {
  $.get(url, function(data) {
    // ...
    if (name) {
      $.get(url2, function(data) {
        // ...
        res = name;
        callback(res);
      }, "html");
    } else {
      callback(null);
    }
  }, "html");
}

Price("url", function(all) {
  console.log(all);
});

Пример использования в цикле:

var size = whil.size(),
  results = [],
  resultCount = 0;
for (var i = 0; i < size; i++) {
  // ...
  (function(i) {
    Price("url", function(res) {
      results[i] = res;
      resultCount++;
      if (resultCount === size) {
        $('#w').html(results.join(""));
      }
    });
  })(i);
}
Peter Olson
  • 10,462
  • Может я чего-то не понял, но как мне с calback'a взять значение ? Price("http://steamcommunity.com/economy/itemhover/730/2/" + one[i] + "?o=" + two[i], function(res) { all = res; }); сделал так, но переменной all ничего не присвоилось. Мне нужно что бы результат ф-и записался в переменную. – Slavik Okara Jul 31 '15 at 07:56
  • 1
    @SlavikOkara Надо поставить код, который использовает результат, в callback. – Peter Olson Jul 31 '15 at 08:08
  • Я добавил код, где вызывается ф-я. Посмотрите пожалуйста. дело в том что ф-ю я вызываю в цикле. А значение хочу использовать после. – Slavik Okara Jul 31 '15 at 08:14
  • @SlavikOkara Важен ли порядок результатов? – Peter Olson Jul 31 '15 at 08:23
  • 1
    @SlavikOkara Я добавил пример использования в цикле. – Peter Olson Jul 31 '15 at 08:30
  • Спасибо вам огромное ! – Slavik Okara Jul 31 '15 at 10:01
  • Все отлично работает, но значения, все же нужно вывести за цикл. Т.е. что бы я мог использовать переменную дальше в скрипте. Это возможно ? – Slavik Okara Jul 31 '15 at 11:50
  • @SlavikOkara Тот код, дальше в скрипте, выполняется до того, что запрос AJAX возвращает результат. Можно сохранить в переменной, но эта переменная не будет иметь значение, пока AJAX не возвращает результат. – Peter Olson Jul 31 '15 at 11:59