Подтвердить что ты не робот

Присвоить значение от успешного обещания к внешней переменной

У меня довольно глупая проблема. Рассмотрим следующее:

vm.feed = getFeed().then(function(data) {return data;});

getFeed() возвращает $q отложенное обещание (я нахожусь на angular), который успешно разрешается.

Моя цель - установить vm.feed равным значению данных, возвращаемому успешным обратным вызовом. Как сейчас, код просто присваивает vm.feed, равный объекту $promise, возвращаемому getFeed().

Я знаю, что могу просто сделать: vm.feed = data внутри разрешенной функции, но я хочу понять, почему этот код не работает, как есть.

PD: обещание разрешается правильно и даже после того, как оно было разрешено. vm.feed остается равным обещанию, а не данным. Я скопирую console.log vm.feed после +10 секунд истек.

Promise {$$state: Object} $$state: Objectstatus:1 value: Object

Это свойство value внутри объекта Promise содержит фактическое решение обещания, которое я хочу назначить vm.feed(e.i. data).

Благодарю вас!

4b9b3361

Ответ 1

Ваше выражение не более чем попросит переводчика присвоить значение, возвращаемое с then() переменной vm.feed. then() возвращает вам обещание (как вы можете видеть здесь: https://github.com/angular/angular.js/blob/master/src/ng/q.js#L283). Вы можете представить это, увидев, что Promise (простой объект) вытащил из функции и получил присвоение vm.feed. Это происходит, как только интерпретатор выполняет эту строку.

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

Хотя в будущей версии, которая обрабатывается для JavaScript (ES2016), будет введено несколько ключевых слов для работы в значительной степени, как вы ожидаете сейчас. Хорошей новостью является то, что вы можете начать писать такой код сегодня, используя трансляцию от ES2016 до текущей широко поддерживаемой версии (ES5).

Хорошее введение в эту тему доступно по адресу: https://www.youtube.com/watch?v=lil4YCCXRYc

Чтобы использовать его прямо сейчас, вы можете преобразовать свой код через Babel: https://babeljs.io/docs/usage/experimental/ (запустив --stage 1).

Здесь вы также можете увидеть несколько примеров: https://github.com/lukehoban/ecmascript-asyncawait.

Ответ 2

Метод then() возвращает Promise. Это два аргумента, оба являются функциями обратного вызова для успешных и неудачных попыток обещания. сам объект обещания не дает вам разрешенных данных напрямую, интерфейс этого объекта предоставляет данные только через обратные вызовы. Итак, вы должны сделать это вот так:

getFeed().then(function(data) { vm.feed = data;});

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

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved
// and its value will be the result of promiseA incremented by 1

Ответ 3

Это может быть обновлено до ES6 со стрелками и выглядеть следующим образом:

getFeed().then(data => vm.feed = data);

Если вы хотите использовать async function, вы также можете сделать следующее:

async function myFunction(){
    vm.feed = await getFeed();
    // do whatever you need with vm.feed below
 }