1

У меня есть файл json, в котором есть массив из объектов. Я хочу его получить в js, перебрать его элементы и выполнить условие. Проблема - значение переменной framePrice не возвращается. Как его вытащить?

var framePrice;
var frames = function(callback) {
    $.ajax({
      url: "js/frames.json",
      success: callback
    });
};

frames(function(result) {
   for (let i = 0; i < result.length; i++) {
      if ((result[i].width == w && result[i].height == h)) {
         framePrice = result[i].price * extra100;
         break;
      } else {
         framePrice = (w * h) / 1000000 * 350 * extra100;
      }
   }
   return framePrice;
});
console.log(framePrice); /// undefined
  • Ajax же не мгновенно выполняется. Сначала он дождется ответа, потом выполнит коллбэк, но console.log ждать не будет пока код выше выполнится и попытается вывести переменную, которая еще не определена. Если хотите работать с этой переменной - работайте в коллбэке – Misha Saidov Jan 26 '19 at 14:01
  • @Misha Saidov а чтобы использовать результат выполнения коллбека, можно как-то эту функцию записать в переменную? я уже немного запуталась – Ирина Попова Jan 26 '19 at 14:24
  • @ИринаПопова уберите return framePrice; и начинайте делать с переменной то, что вы хотите. Что вам мешает? – Misha Saidov Jan 26 '19 at 15:21

2 Answers2

0

// products = [{"width":100,"height":10,"price":1000},{"width":10,"height":100,"price":2000}]

const promisedPrice = new Promise((resolve, reject) => {

const

filter = (w, h) =&gt; p =&gt; p.width === w &amp;&amp; p.height === h,

success = r =&gt; {

  const product = r.find(filter(100, 10))

  if (typeof product !== 'undefined')
    resolve(product.price)

  else
    reject(null)
},

error = r =&gt; {
  console.warn(r)
  reject(null)
}

fetch( '//www.mocky.io/v2/5c4c69963700005700b04265', { method: 'POST', credentials: 'same-origin' } ) .then(r => r.json()) .then(success) .catch(error) })

Promise.resolve(promisedPrice).then(alert)

// alert (1000)

https://jsfiddle.net/wxor12ga/3/

  • спасибо большое, кажется, это сработает) только вопрос: как записать результат в переменную? типа framePrice = Promise.resolve(promisedPrice).then() – Ирина Попова Jan 26 '19 at 15:55
  • const setPrice = price => framePrice = price; Promise.resolve(promisedPrice).then(setPrice) –  Jan 26 '19 at 16:08
  • почему-то выводится undefined, т.е. не перезаписывается значение – Ирина Попова Jan 26 '19 at 16:31
  • ответственно вам заявляю: тут телепатов нет. покажите ваш код целиком вместе с frames.json –  Jan 27 '19 at 05:57
0

Проблема решилась вот так. Использовала async/await, а результат вычисления внутри функции вывела в свойство объекта внешнего

const fetchReady = async() => {
                    try {
                        const setting = { method: 'POST', credentials: 'same-origin'};
                        const response = await fetch('js/framesReady.json', setting);
                        const data = await response.json();
                        return data;
                    } catch (error) {
                        console.log(error.message);
                    }
                };

                fetchReady()
                    .then((data) => {
                        $.each(data, (i, item) => {
                            if (item.width == w && item.height == h) {
                                framePrice = item.price * extra100;
                                return framePrice;
                            }
                        });
                        console.log(framePrice);
                        self.framePriceTotal = framePrice;
                    });