как заменить переменную X данными с индексом 0 массива со значением 'X' - PullRequest
0 голосов
/ 23 января 2020
    this.work[0].minValue = await this.getData().then(
      value => value[0].set.min.X
    )
    this.work[1].minValue = await this.getData().then(
      value => value[0].set.min.Y
    )
    this.work[2].minValue = await this.getData().then(
      value => value[0].set.min.Z
    )
    this.work[3].minValue = await this.getData().then(
      value => value[0].set.min.A
    )
    this.work[4].minValue = await this.getData().then(
      value => value[0].set.min.B
    )
    this.work[5].minValue = await this.getData().then(
      value => value[0].set.min.C
    )

Я пытаюсь написать эти 6 строк кода внутри al oop, что я не могу сделать. Может ли кто-нибудь помочь мне.

var arr = ['X', 'Y', 'Z', 'A', 'B', 'C']
    var i = 0
    var that = this
    this.work.forEach(item => {
      item.minValue = that.getData().then(value => value[0].set.min.that.arr[i])
      i++
    })

Я знаю, что это неправильно с min.that.arr [i] . Пожалуйста, не говорите причину, почему это не так работает, пожалуйста, помогите мне с решением.

Ответы [ 4 ]

1 голос
/ 23 января 2020

Причина, по которой это не работает, заключается в том, что then является асинхронным. В момент выполнения обратного вызова i будет иметь максимальное значение для всех обратных вызовов (в данном примере это означает 5).

Вместо этого используйте индекс, предоставленный forEach* 1008. * l oop (второй аргумент, предоставленный функции обратного вызова).

const arr = ['X', 'Y', 'Z', 'A', 'B', 'C'];

this.work.forEach((item, index) => {
  const chr = arr[index];
  this.getData().then(value => {
    item.minValue = value[0].set.min[chr];
  });
});

// or using an async arrow function
this.work.forEach(async (item, index) => {
  const chr = arr[index];
  const value = await this.getData();
  item.minValue = value[0].set.min[chr];
});

Обратите внимание, что, вероятно, не стоит делать один и тот же асинхронный вызов на каждой итерации, и вы, скорее всего, захотите переместить запрос данных до l oop. Я предполагаю, что функция обертывания уже использует ключевое слово async, так как в вашем примере вы также используете await this.getData().

const arr = ['X', 'Y', 'Z', 'A', 'B', 'C'];
const value = await this.getData();

this.work.forEach((item, index) => {
  const chr = arr[index];
  item.minValue = value[0].set.min[chr];
});

Подробнее о проблеме i можно узнать здесь. .

1 голос
/ 23 января 2020

Если я правильно понимаю, вам нужен только один звонок на getData вне l oop, нет необходимости делать это на каждом ходу l oop. Кроме того, вам не нужно i в качестве переменной, так как она может быть предоставлена ​​в качестве аргумента в функции обратного вызова forEach:

var arr = ['X', 'Y', 'Z', 'A', 'B', 'C']
var that = this
await that.getData().then(
    value => {
        that.work.forEach((item, i) => {
            item.minValue = value[0].set.min[arr[i]]
        })
    }
)
0 голосов
/ 23 января 2020

значение [0] .set.min [arr [i]]

то, что предложил ашкан, исправило мою проблему.

0 голосов
/ 23 января 2020

Действие должно быть в then:

var arr = ['X', 'Y', 'Z', 'A', 'B', 'C']
var i = 0
var that = this
this.work.forEach(item => {
  that.getData().then(value => item.minValue = value[0].set.min.that.arr[i++])
})
...