Ошибка: {#each} выполняет итерацию только по объектам, подобным массивам. Javascript и Svelte

<script context="module">
    import GhostContentAPI from '@tryghost/content-api';

    // const api = 'http://localhost/posts';
    const api = new GhostContentAPI({
        url: 'http://localhost',
        key: '95a0aadda51e5d621abd2ee326',
        version: "v3"
    });

    export async function preload({ params, query }) {
        try {
            const response = await api.posts.browse({ limit: 5, fields: 'title, slug' });
            return {
                posts: response
            }
        } catch(err) {
            console.log('Error');
        }
    }
</script>

<script>
    export let posts;
</script>

<svelte:head>
    <title>Blog</title>
</svelte:head>

<h1>Recent posts</h1>
<ul>
    {#each posts as post}
        <li>
            <a rel='prefetch' href='blog/{post.slug}'>{post.title}</a>
        </li>
    {/each}
</ul>

Я использую ванильный JavaScript и Svelte, чтобы просто получить список сообщений блога, которые являются объектами из Ghost Blog Rest API. Функция Ghost API работает нормально и извлекает правильные объекты, но проблема начинается при попытке использовать блок Svelte {#each} для отображения каждого объекта, потому что они не находятся в массиве, и я не могу понять, как это исправить. Вот точное сообщение об ошибке в консоли:

Error: {#each} only iterates over array-like objects.

Написание console.log(response) после объявления const response выводит прикрепленное изображение, но только если я сначала закомментирую блок {#each}.

Я предполагаю, что мне просто нужно переместить 5 объектов в массив, но я также не понимаю, почему console.log выше работает только тогда, когда HTML закомментирован.

Изображение журнала консоли


person Joe Berthelot    schedule 08.04.2020    source источник
comment
Попробуйте повторить posts.length в своем шаблоне, чтобы увидеть, что это такое. Интересно, не сталкиваетесь ли вы с проблемой асинхронности?   -  person Taplar    schedule 08.04.2020
comment
@Taplar интересно ... ведение журнала response.length возвращает 5, но запись posts.length после экспорта возвращает Cannot read property 'length' of undefined.   -  person Joe Berthelot    schedule 08.04.2020
comment
Или вместо этого сделайте console.log(JSON.stringify(posts, null, 2)). См. странное поведение массива в javascript для получения дополнительной информации о том, что я показывает, когда вы наводите на него курсор.   -  person Heretic Monkey    schedule 08.04.2020
comment
@HereticMonkey, который на самом деле вернул все отлично, в массиве ... интересно. Это струна, но близкая.   -  person Joe Berthelot    schedule 08.04.2020
comment
Я полагаю, это зависит от того, где вы запускаете код. Например, запустите это непосредственно перед вашим {#each} в шаблоне, и вы можете получить что-то другое. Я не знаю, стройный, призрачный или саперный, но обычно есть способ сообщить шаблону, что массив будет заполнен асинхронно. Может, если бы ты только что сделал export let posts = [];?   -  person Heretic Monkey    schedule 08.04.2020
comment
@HereticMonkey, вносящий это изменение, фактически запускает catch в приведенном выше утверждении.   -  person Joe Berthelot    schedule 08.04.2020
comment
Показывает то, что я знаю :). Я позволю стройным экспертам взять на себя ответственность. Удачи.   -  person Heretic Monkey    schedule 08.04.2020
comment
@HereticMonkey, на самом деле, это сработало! У меня была опечатка, из-за которой уловка была. Спасибо!   -  person Joe Berthelot    schedule 08.04.2020


Ответы (3)


Меняется:

export let posts;

to

export let posts = [];

исправил проблему. Спасибо @Heretic Monkey

person Joe Berthelot    schedule 08.04.2020

Я столкнулся с аналогичной проблемой. Это произошло во время работы с Firebase Firestore, и, сравнив ошибочное значение с прототипом, приведенным в официальной документации svelte, я пришел к выводу.

введите описание изображения здесь

Поэтому я просто использовал метод javascript Object.values() для извлеченного объекта, и {#each} only iterates over array-like objects ошибка исчезла.

person RAZ0229    schedule 19.05.2021

Это происходит и в Dispatching. Решение - это не переназначение массива, решение выглядит примерно так:

const array = [];
let newArray = [e.detail, ...array];
person Ali Bahaari    schedule 13.10.2020