возвращая JSON из javascript fetch - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь узнать, как заменить функции обратного вызова на асинхронные и ожидающие. Через два дня у меня работает следующее: он записывает json в консоль из внутри функции.

const requestRoster = async ()=> {
    const response = await fetch('/testing/getRoster.php', {
        method: 'get',
        headers: {
            'Content-Type': 'application/json'
        }
    })
    const json = await response.json()
    console.log(json); // writes the array json to the console
    return json; //apparently returns a pending promise
}



Однако, когда я говорю

$roster = requestRoster();
console.log ($roster); // writes Promise{<pending}> to the console
​

Консоль сообщает

Обещание {} Когда я раскрываю эту строку, я вижу:

Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Array(64)

и Array (64) содержит нужные мне данные.

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

Спасибо,

Ответы [ 3 ]

3 голосов
/ 04 ноября 2019

Когда вы используете ключевое слово async, функция автоматически возвращает Promise .

И ключевое слово await используется для ожидания разрешения обещания.

Вы можете легко сделать это следующим образом:

$roster = await requestRoster();

Но обратите внимание, что это можно сделать только в функции, которая сама является async. Если вы хотите использовать его на верхнем уровне, вы можете использовать IIFE (выражение для немедленного вызова функции), например:

(async () => {
  $roster = await requestRoster();
  // do something with $roster here
})();
1 голос
/ 04 ноября 2019

Объявленная функция async возвращает обещание, даже если вы возвращаете простое значение. Если вы возвращаете такое значение, оно включается в уже разрешенное Обещание, которое вы можете прочитать известными способами.

Если вы находитесь в другой асинхронной функции, вы можете ожидать ее.

$roster = await requestRoster();

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

requestRooster().then( (roster) => { /* do something with rooster*/ } );
0 голосов
/ 04 ноября 2019

просто удалите , ожидайте из этой строки:

const json = await response.json()
...