0
Promise {<resolved>: Array(3)}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Array(3)
0: {msg1: "Hello world"}
1: {msg2: "Hello world1"}
2: {msg3: "Hello world2"}
length: 3
__proto__: Array(0)

Нужно достать вот эти msg. Пытался через точку получить и через квадратные скобки, ничего не получается

  • Попробовал как вы сказали. Пишет undefined – Чынгыз Усенов Apr 23 '19 at 06:17
  • У меня по другому. Сюда я делаю запрос. Можете попробовать – Чынгыз Усенов Apr 23 '19 at 06:25
  • конечно трудно понять что там у вас без окружающего кода. но судя по всему вы в переменную сохраняете промис, а вам нужно увидеть результат выполнения промиса. у вас написано что-то типа var result = myAsyncFunc(args); а надо написать что-то типа var result; myAsyncFunc(args).then(response => result = response); – muturgan Apr 23 '19 at 06:26
  • рекомендую ознакомиться https://ru.stackoverflow.com/questions/554290/%D0%9A%D0%B0%D0%BA-%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D0%B7-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F-%D0%B8%D0%BB%D0%B8-%D0%B8%D0%B7-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B0-%D0%98%D0%BB%D0%B8-%D1%85%D0%BE%D1%82%D1%8F-%D0%B1%D1%8B-%D0%B4%D0%BE%D0%B6 – muturgan Apr 23 '19 at 06:27
  • Спасибо! Работает! – Чынгыз Усенов Apr 23 '19 at 07:04

1 Answers1

2

Ваш объект - это обещание (промис, Promise), настоящее значение спрятано у него внутри слота [[PromiseValue]]. Доступа к этому слоту напрямую нет, выцепить его можно только двумя способами.

Способ первый - метод .then:

v.then(data => {
    console.log(data[0].msg1);
    console.log(data[1].msg2);
    console.log(data[2].msg3);
})

Способ второй - через await внутри асинхронного метода:

data = await v;
console.log(data[0].msg1);
console.log(data[1].msg2);
console.log(data[2].msg3);

Но не пытайтесь "обмануть" систему и вытащить значение раньше чем следует! Обещание - это абстракция значения, которого ещё не существует, но оно будет доступно когда-то в будущем. Именно поэтому и не существует способа "достать" из него значение прямо сейчас.

Если вы попытаетесь сделать как-то вот так:

let result;
v.then(data => result = data); // не делайте так!
console.log(result);

то вы обнаружите, что ничего не получилось, переменная result осталась неопределенной.

Почему так получается можно увидеть, если посмотреть на порядок выполнения программы:

let result; // 1
v.then(data => {
    result = data; // 4
}) // 2
console.log(result); // 3

Сначала выполняется 1, потом выполняется вызов then (но переданная функция ещё не была вызвана!), наконец выполняется 3 и т.д. И только много позже, когда наступит какое-то внешнее событие, а управление вернется очереди событий, будет выполнена строка 4.

Pavel Mayorov
  • 58,537