Как я могу получить доступ к результату обещания вне тела обещания? - PullRequest
1 голос
/ 02 ноября 2019

У меня есть функция обещания, например, getName(code), поэтому мы имеем:

getName(code)
  .then(...)
  .catch(...);

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

Как мы можем связать определенный вызов функции и метода?

Например:

async function name(code) {
  getName(code)
    .then(...)
    .catch(...);
  return ???
}

for (let i = 0; i <= 10; i++) {
  let x = name(i);
  // Do something with x, for example:
  alert(x);
}

PS: я знаю, что результат доступен внутри .then тела, но я хочу получить доступон находится внутри области действия name и возвращает его из функции.

Ответы [ 2 ]

4 голосов
/ 02 ноября 2019

Использование await

async function name(code) {
    try {
        const name = await getName(code);
        // Do something here
        return name;
    } catch (e) {
        console.log('[ERROR]', e);
    }
}

Помните, чтобы использовать await, код должен быть заключен в функцию async.

2 голосов
/ 02 ноября 2019

Меня спросили, что я бы предложил.

У вас есть асинхронный результат. Это означает, что ваша функция возвращается задолго до того, как асинхронный результат станет доступен. Следовательно, вы не можете вернуть асинхронный результат напрямую.

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

В вашем случае вы уже используете обещания, так что имеет смыслэто просто вернуть обещание, которое у вас уже есть:

function name() {
    return getName(code).then(...);
}

Нет смысла использовать здесь функцию async или await, поскольку у вас есть только одна асинхронная операция, которая уже получила обещание. Просто верни это обещание. Мы не помещаем здесь обработчик .catch(), потому что на этом уровне не требуется никакой конкретной обработки ошибок - мы хотим, чтобы вызывающее лицо было замечено вызывающей стороной как есть.

Затем, чтобы использовать эту функцию, которая возвращаетобещание, вы можете использовать .then() на нем:

name().then(result => {
    // use the result in here
    console.log(result);
}).catch(err => {
    console.log(err);
});

или вы можете использовать await:

async function someOtherFunc() {
    try {
        let result = await name();
        // do something with result here
    } catch(e) {
        console.log(e);
    }
}

Я знаю, что результат доступен внутри.hen body, но я хочу получить к нему доступ внутри области имен функций и вернуть его из функции.

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

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