Разрешить функцию, которая использует Promise - PullRequest
1 голос
/ 27 марта 2019

У меня есть следующая асинхронная функция

export default async function getUserNames(id: string[]): Promise<string[]> {
    let userNames: string[] = [];
    // We do some stuff here like calling a service, etc...

    return userNames;
}

В другом файле для машинописи я импортирую функцию getuserNames и пытаюсь вызвать ее следующим образом:

const promiseResult = getUserNames(idList)
        .then(result => {
            return result;
        })
        .catch(error => {
            return undefined;
        });

    if (promiseResult) {
        // Do something else here.
    }

ОднакоТип обещания - Promise вместо string [], что я и ожидал.Как я могу вызвать функцию getuserNames, и когда это будет сделано, фактическая строка [] будет возвращена переменной обещания?

РЕДАКТИРОВАТЬ Допустимо ли делать что-то подобное?

let varB: string[];
const promiseResult = getUserNames(idList)
        .then(result => {
            varB = result;
        })
        .catch(error => {
            varB = undefined;
        });

if (varB) {
        // Do something else here.
    }

Наконец, обратите внимание, что функция, вызывающая getUserNames, не определена как асинхронная, и я не могу это изменить.

Ответы [ 3 ]

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

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

1) использовать обратный вызов обещания .then

getUserNames(idList)
  .then(result => {
    // Do something else here.
  })

2) Введите кодв асинхронной функции и используйте ключевое слово await:

async function someFunction () {
  const result = await getUserNames(idList);
  // Do something else here.
}

Обратите внимание, что поскольку все асинхронные функции возвращают обещания, someFunction вернет обещание в этом примере.

0 голосов
/ 27 марта 2019

Вам не нужно использовать async / await в вашем коде.

/**
 * async data fetcher
 * @param {String} url 
 * @param {Object} options 
 * @returns {Promise}
 */
const fetch = (url, options) => {
  return new Promise((resolve, reject) => {
    fetch(url, options)
      .then((response) => {
        if (response.ok) {
          return resolve(response.json)
        }
        return reject(response.json)
      })
      .catch((error) => reject({ error }))
  })
}

/**
 * async fetch wrapper, returns a Promise
 * @param {NUmber} id 
 * @returns {Promise}
 */
const getUserNames = (id) => {
  return fetch('www.yourapi.com/get_user_names', { params: { id } })
}

const idList = [1, 2, 3]
// so, your code also will be asyncronious too:
Promise.all([getUserNames(idList)]).then((promiseResult) => {
  if (promiseResult) {
    // Do something else here.
  }
})
0 голосов
/ 27 марта 2019

getUserNames возвращает promise<string[]>, это именно то, что говорит его подпись.

Вы должны выполнить свои if (result) внутри then

Или вы можете использовать новое ключевое слово await, которое будет гарантировать, что обещание будет выполнено до того, как оно будет присвоено promiseResult В этом случае оберните ваш await внутри try / catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...