Promise в цикле

236
19 декабря 2017, 20:04

Здравствуйте. Есть объект workspace и входной JSON. Необходимо отформатировать и/или получить данные и записать их в этот workspace. Использую цикл для перебора элементов JSON, при этом значения уже существующие, такие как текст, например, попадают в workspace, а данные, которые нужно ждать (получить курс валют например), приходят после выполнения цикла. Для последних использую промисы, но все равно, они приходят после. Помогите разобраться. Ниже код:

var checkJson = function(json) { 
  return new Promise((resolve, reject) => { 
    var workspace = {}; 
    for (var i = 0; i < json.length; i++) { 
      var id = json[i].id.match(/\D+/)[0]; 
      switch (id) { 
        case 'background': 
          workspace['background'] = {}; 
          workspace['background'] = createBackground(json[i], workspace['background']); 
          break; 
        case 'text': 
          if (countert == 0) { 
            workspace['text'] = {} 
          } 
          workspace['text'] = createText(json[i], workspace['text']); 
          countert++; 
          break; 
        case 'time': 
          if (countertime == 0) { 
            workspace['time'] = {} 
          } 
          createTime(json[i], workspace['time']) 
            .then(res => { 
              workspace['time'] = res; 
              countertime++; 
            }); 
          break; 
        case 'currencycourse': 
          if (counterCourse == 0) { 
            workspace['currencycourse'] = {} 
          } 
          createCurrensyCourse(json[i], workspace['currencycourse']) 
            .then(res => { 
              workspace['currencycourse'] = res; 
              counterCourse++; 
            }) 
            .catch(err => { 
              console.log(err); 
            }); 
          break; 
          // default: 
          //     console.log(itm_id); 
          //     break; 
      } 
    } 
    Promise.all([workspace]) 
      .then(values => { 
        // console.log("values", values); 
        resolve(values); 
      }); 
  }); 
};

Проблема именно с курсом валют, последний resolve выкидывает заполненный workspace, только currencycourse = {}

Answer 1

Кажется так:

async function checkJson(json): Promise<any> {
    const workspace = {
      background: {},
      text: {},
      time: {},
      currencyCourse: {}
    };
    for (const jsonNode of json.length) {
      const id = jsonNode.id.match(/\D+/)[0];
      switch (id) {
        case 'background':
          workspace.background = createBackground(json[i], workspace.background);
          break;
        case 'text':
          workspace.text = createText(json[i], workspace.text);
          break;
        case 'time':
          workspace.time = await createTime(json[i], workspace['time']);
          break;
        case 'currencycourse':
          workspace.currencyCourse = await createCurrensyCourse(json[i], workspace.currencyCourse)
          break;
        default:
          console.log('default');
      }
    }
    return workspace;
};
READ ALSO
Hover на объект и отображение кнопки three js

Hover на объект и отображение кнопки three js

Есть объекты на сцене, при на ведении на один из объектов хочу отобразить так сказать "меню", а точнее кнопку на подложке, при нажатии на нее...

244
Замена аттрибута у input, type-&gt;password и обратно

Замена аттрибута у input, type->password и обратно

Как можно реализовать замену атрибута type с password на text и обратно у input по наведению на элемент

228
Вызов js кода в html

Вызов js кода в html

Попалось такое задание, не понимаю как с точки зрения синтаксиса это должно выглядеть в html и js файлахНиже привожу текст задания и то, как...

282