Uncaught SyntaxError: отсутствует) после списка аргументов при использовании Object.assign await - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь воспроизвести сгруппированную гистограмму, используя D3 из Observable . Я запускаю скрипт на Chrome с D3.v5.

В скрипте у меня есть:

var data = Object.assign(await d3.csv("https://gist.githubusercontent.com/mbostock/3887051/raw/805adad40306cedf1a513c252ddd95e7c981885a/data.csv",
    d3.autoType), {
    y: "Population"
});

Когда я запустил его в HTML, он показывает следующую ошибку:

Uncaught SyntaxError: отсутствует) после списка аргументов

Я попробовал это на консоли Chrome, все отлично работает.

Содержимое файла HTML:

<!DOCTYPE html>
<meta charset="utf-8">

<body>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>


var margin = {top: 10, right: 10, bottom: 20, left: 40},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;
 

var data = Object.assign(await d3.csv("https://gist.githubusercontent.com/mbostock/3887051/raw/805adad40306cedf1a513c252ddd95e7c981885a/data.csv", d3.autoType), {y: "Population"});
 

</script>

В случае успеха данные должны быть объектом в следующем виде:

[{…}, {…}, {…}, {…}, {…}, {…}, columns: Array(8), y: "Population"]

1 Ответ

3 голосов
/ 03 июля 2019

Вы хотите переместить код из записной книжки Observable в обычный сценарий JavaScript.В этом случае вы не можете использовать await, как вы это сделали.

Если вы посмотрите на страницу MDN , вы очень четко увидите, что:

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

Как говорится, эта async функция с вашим кодом внутри будет работать:

(async function foo() {
  const data = Object.assign(await d3.csv("https://gist.githubusercontent.com/mbostock/3887051/raw/805adad40306cedf1a513c252ddd95e7c981885a/data.csv", d3.autoType), {
    y: "Population"
  });
  console.log(data)
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

Этот код работал внутри записной книжки из-за способа работы записных книжек:

Наблюдаемая уже поддерживает асинхронные генераторы в некотором смысле:Вы также можете определить (синхронную) ячейку генератора, которая дает обещания.Наблюдаемый ждет, пока предыдущее обещание разрешится, прежде чем вытащить следующее из генератора.( source )

Наконец, относительно вашего наблюдения, что код работал на консоли Chrome: это не просто Chrome, этот код будет работать без async в большинстве современных браузеров.приставка.Объяснение заключается в том, что код в консоли по умолчанию заключен в async.Вот хорошее чтение: https://medium.com/@tomsu/devtools-tips-day-7-the-simple-joys-of-async-console-578f4ce67df4

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