Может кто-нибудь объяснить мне, почему этот «конвейер» JavaScript Promise не сохраняет массив, который я вставляю ... а индекс начала делает? - PullRequest
0 голосов
/ 14 марта 2019

Я прошу прощения, если это было затронуто ранее ... но я не смог найти вопрос, который дал мне ответ ... или, возможно, если бы существовал тот, который я встретил ... это не так нажмите для меня.

Итак, у меня изначально был следующий код, который я пытался использовать:

var nums = [];
for (var i = 0; i < 100; i++)
  nums.push(i * 5);

var nextPromise = Promise.resolve(0, nums);

for (var i = 0; i < nums.length; i++){
  nextPromise = nextPromise.then((index, arr) => {
    console.log('index =>', index);
    console.log('nums[' + index + '] === ' +  arr[index]);
    return ++index;
  });
}

... но arr [index] приведет к тому, что arr будет неопределенным, и я получу ошибку ...

(index):40 Uncaught (in promise) TypeError: Cannot read property '0' of undefined

Может кто-нибудь объяснить мне, почему arr становится неопределенным? Это было выполнено в JsFiddle, если это поможет.

Я придумал тот, который работает нормально ... но я не понимал, почему конвейерной передачи массива через возвращаемые значения каждого обещания было недостаточно ... Следующий код работает нормально ... Я просто получаю доступ к числам на внутренней области, которая все еще поддерживается из внешней области:

var nums = [];
for (var i = 0; i < 100; i++)
  nums.push(i*5);

var nextPromise = Promise.resolve(0);

for (var i = 0; i < nums.length; i++) {
  nextPromise = nextPromise.then(index => {
    console.log('index =>', index);
    console.log('nums[' + index + '] === ' +  nums[index]);
    return ++index;
  });
}

Я бы хотел знать, почему arr становится неопределенным ... не имеет смысла для меня, так как nums сохраняет область действия ... но, по-видимому, arr нет?

[Редактировать: Выбранный ответ] Так что спасибо @Evert и дальнейшим разъяснениям от @Phil. Я не понимал, решимость использовал только первый аргумент. С этой информацией ... следующий код помог вам, у кого может быть проблема. Я до сих пор не могу поверить, что я не осознавал, что было только возвращаемое значение индекса ++ ... вздох.

Блок рабочего кода:

var nums = [];
for (var i = 0; i < 100; i++)
  nums.push(i * 5);

var nextPromise = Promise.resolve({index: 0, arr: nums});

for (var i = 0; i < nums.length; i++){
  nextPromise = nextPromise.then(params => {
    console.log('index =>', params.index);
    console.log('nums[' + params.index + '] === ' +  params.arr[params.index]);
    return {index: ++params.index, arr: params.arr};
  });
}

1 Ответ

1 голос
/ 14 марта 2019

Когда ваш обратный вызов из then() возвращает значение, это значение будет использоваться в качестве первого аргумента следующей then() функции.

Используется только первый аргумент в вашем then() обратном вызове.

...