JavaScript |Получить доступ к объекту Обещания из другого Обещания - PullRequest
0 голосов
/ 05 февраля 2019

В моем приложении AngularJS я хочу получить доступ к возвращаемому значению Promise, к которому я обращаюсь из службы за пределами моего контроллера, и импортировать его туда.Это обещание, вернуть объект.Я хочу получить доступ к этим объектам и свойствам внутри него.

Я создал службу для получения этой конечной точки.Смотрите ниже:

export const getEndpoints = () => {
  const options = {
    method: httpMethod.GET,
    url: endpoint.ENVIRONMENT,
  };
  return Instance(options);
};

Вышеупомянутый сервис в свою очередь читает конечную точку, которую я предоставляю, и использует axios в фоновом режиме.Эта часть работает просто отлично.

Затем импортировала ее на мой угловой контроллер:

import { getEndpoints } from './config/service';

Наконец я создал эту функцию:

$scope.isItAvailable = false; // I will use this later to check the actual value. It is not important in the scope of the question..

  const checkIfItIsAvailable = () => {
    return new Promise((resolve, reject) => {
      resolve(getEndpoints)
      console.log(getEndpoints)
    })
  }

  // And in my main function I am just calling the above
  const mainFn = () => {
    checkIfItIsAvailable()
    // Along with a few others..
  }

ActualРезультаты Теперь в моей консоли выводится функция checkIfItAvailable.

Ожидаемые результаты Вместо этого я хочу вывести на консоль фактическое значение, которое возвращается исходным обещанием, объект и его свойства.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Можно получить доступ к разрешенному результату getEndpoints в checkIfItIsAvailable, вызывая getEndpoints() и используя then() function:

const checkIfItIsAvailable = () => {
  return new Promise((resolve, reject) => {
    // call getEndpoints
    getEndpoints()
      // call then to get a result from getEndpoints
      .then(res => {
        console.log(res);
        // checkIfItIsAvailable will be resolved with
        // the result of getEndpoints
        resolve(res);
      });
  });
}
0 голосов
/ 05 февраля 2019

Здесь getEndpoints - это асинхронная функция, которая возвращает Promise, и способ получить возвращаемое значение из обещания - использовать then callback.Вы можете сделать это так:

const checkIfItIsAvailable = () => {
    return new Promise((resolve, reject) => {
      getEndpoints().then(resultOfEndPoint => {
        console.log(resultOfEndPoint);
        resolve(resultOfEndPoint);
      });
    })
  }
0 голосов
/ 05 февраля 2019

Вероятно, вам нужно вызывать эту функцию, а не просто передавать ее в качестве параметра.

const checkIfItIsAvailable = () => {
    return new Promise((resolve, reject) => {
      resolve(getEndpoints()) // here
      console.log(getEndpoints())
    })
  }

Затем, чтобы потом разрешить это в вашей основной функции, или где угодно - просто используйте then:

const mainFn = () => {
    checkIfItIsAvailable().then((result) => {
       // do what you need with result here
       // $scope.isItAvailable = result   probably like this
    });
}

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

Кроме того, здесь есть фрагмент, иллюстрирующий, что вам нужно вызывать его, а не просто передавать.

// here is an example function which just return some string
function getSomething() {
  return 'something'; // it could be a promise also
}

// here is example without calling functions, but just passing:
const promise = new Promise((resolve, reject) => {
  console.log('NO CALL: ', getSomething);
});

// here is example with calling, so value is resolved
const promise2 = new Promise((resolve, reject) => {
  console.log('CALLED: ', getSomething());
});
...