async / await не работает в сочетании с fetch


Я пытаюсь использовать ES7 async / await вместе с fetch. Я знаю, что близок к этому, но не могу заставить его работать. Вот код:

class Bar {
    async load() {
        let url =  'https://finance.yahoo.com/webservice/v1/symbols/goog/quote?format=json';
        try {
            response = await fetch(url);
            return response.responseText;
        } catch (e) {
            return e.message;
        }
    }
}

Который я использую следующим образом:

let bar = new Bar();
bar.load().then(function (val) {
    console.log(val);
});

Демо

Почему-то я всегда попадаю в catch с сообщением

response is not defined

Есть предложения, что я делаю не так ?

Обновление: как было предложено в комментариях, это может быть проблема с fetch, поэтому я попробовал упрощенную версию (ES5):

<!doctype html>

<html>
    <head>      
        <script>
            var url =  'https://finance.yahoo.com/webservice/v1/symbols/goog/quote?format=json';
            fetch(url, {method: 'get', mode: 'cors'}).then(function (response) {
                       console.log(response.responseText);
               });
        </script>
    <head>

   <body></body>
<html>

И все же не работает : (однако, если я заменю fetch, это сработает:

var request = new XMLHttpRequest();
request.open("GET", url, false);
request.send(null);
console.log(request.responseText);
1 11

1 ответ:

Вы забыли объявить response как переменную. Код класса-это всегда строгий код, и вам не сойдет с рук присвоение неявно глобальных переменных. Вместо этого он бросает ReferenceError.

Помимо этого, Response объекты не имеют свойства responseText, как XHR, у них есть метод .text(), который ожидает получения тела и возвращает обещание.

class Bar {
    async load() {
        let url =  'https://finance.yahoo.com/webservice/v1/symbols/goog/quote?format=json';
        try {
            let response = await fetch(url);
//          ^^^^
            return await response.text();
//                                ^^^^^^
        } catch (e) {
            return e.message;
        }
    }
}