JavaScript: 1 неопределенное значение в результатах Promise.all - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь разбить обещания, так как хочу в конечном итоге вернуть результаты SQL-запроса в рамках обещания myPromise, чтобы я закончил со списком результатов многих SQL-запросов.

var myList = [];

for (let i = 1; i <= 20; i++) {
  var myPromise = new Promise(function(resolve, reject) {
    myList.push(myPromise);
    resolve("ITEM " + i);
  })
}

Promise.all(myList).then(function(values) {
  console.log(values);
});

console.log("End");

Выход:

[ undefined,
  'ITEM 1',
  'ITEM 2',
  'ITEM 3',
  'ITEM 4',
  'ITEM 5',
  'ITEM 6',
  'ITEM 7',
  'ITEM 8',
  'ITEM 9',
  'ITEM 10',
  'ITEM 11',
  'ITEM 12',
  'ITEM 13',
  'ITEM 14',
  'ITEM 15',
  'ITEM 16',
  'ITEM 17',
  'ITEM 18',
  'ITEM 19' ]

Как я понимаю, как это работает: Мой цикл немедленно добавляет новое обещание к myList, затем, когда оно разрешено, обещание заменяется строковым значением, переданным в resolve.

Это работает хорошо, но в итоге я получаю 1 неопределенное значение. У меня есть всего 20 пунктов, что ожидается, но один не определен. Почему это?

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

myPromise, который вы нажимаете на myList, создается после , запускается конструктор Promise. Итак, на первой итерации myPromise равно undefined (а на последующих итерациях last myPromise помещается в массив).

Создайте Обещание, а затем немедленно вместо этого отправьте массив в ту же итерацию:

var myList = [];

for (let i = 1; i <= 20; i++) {
  var myPromise = new Promise(function(resolve, reject) {
    resolve("ITEM " + i);
  });
  myList.push(myPromise);
}
Promise.all(myList).then(function(values) {
  console.log(values);
});

console.log("End");

Возможно, будет понятнее, если вы вручную поднимите myPromise (чтобы код был ближе к тому, как его выполняет интерпретатор):

var myPromise;
var myList = [];
for (let i = 1; i <= 20; i++) {
  myPromise = new Promise(function(resolve, reject) {
    resolve("ITEM " + i);
  });
  myList.push(myPromise);
}
Promise.all(myList).then(function(values) {
  console.log(values);
});

console.log("End");
3 голосов
/ 18 марта 2019

В первый раз вы нажимаете myPromise на myList, пока он еще не определен.

Вы можете это исправить, полностью исключив переменную myPromise.

var myList = [];

for (let i = 1; i <= 20; i++) {
    myList.push(new Promise(function(resolve, reject) {
        resolve("ITEM " + i);
    }))
}

или нажав на myList впоследствии.

for (let i = 1; i <= 20; i++) {
    var myPromise = new Promise(function(resolve, reject) {
        resolve("ITEM " + i);
    })
    myList.push(myPromise);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...