Наблюдаемый из массива длиной 1 возвращаемый объект - PullRequest
0 голосов
/ 14 июля 2020

У меня есть функция, которая возвращает Observable. Это выглядит так:

public dissasemble (file) {
    const signatureContainers = [someOtherFunc(file)];
    return from(signatureContainers);
}

Он вызывается из другой функции, например:

public verify (file) {
    dissasemble(file).subscribe(signatureContainers  => {
        signatureContainers.forEach(sc => { // I get an exception here because signatureContainers is an object and not an array
            // do something
        });
    });
}

Когда я отлаживаю выполнение кода внутри подписки, я вижу, что signatureContainer является объектом, а не массивом

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Оператор from генерирует предоставленный массив в форме каждого элемента в виде потока значений.

(Для простоты предположим, что someOtherFunc() возвращает здесь 'a') Подписка на from(['a']) будет на самом деле возвращает 'a' как значение (а НЕ ['a']).

Я думаю, что вы ищете оператор of. Это приведет к выдаче предоставленного значения (в вашем случае - массива) в виде массива при подписке.

Проще говоря (и в вашем контексте):

from(['a']).subscribe(value => console.log(value));
// outputs: 'a'

of(['a']).subscribe(value => console.log(value));
// outputs: ['a']

Итак, ответ: Чтобы получить ожидаемый результат, используйте оператор of вместо оператора from:

public dissasemble (file) {
    const signatureContainers = [someOtherFunc(file)];
    return of(signatureContainers);
}

Дополнительные сведения см. В этой документации: из и из (оба из разных источников, просто чтобы поделиться с вами дополнительными ресурсами по Rx JS :))

Удачи!

0 голосов
/ 14 июля 2020

Из этой документации о функции from вы можете видеть, что в ней говорится следующее:

Для массивов и итераций все содержащиеся значения будут выдаваться как sequence!

Это означает, что каждое значение в массиве будет передаваться одно за другим. Поскольку ваш массив имеет только одно значение, вы получите только одно испускаемое значение.

Вы, вероятно, захотите использовать вместо него of().

...