Как бороться с кортежами, когда они возвращаются из функции aync в горных потоках? - PullRequest
0 голосов
/ 18 сентября 2018

Я использую tsc@2.3.4 и highland@^2.13.0.

У меня есть асинхронная функция, которая возвращает кортеж типа [string, string[]].

Я работал с Highland в прошлом,и я знаю, что могу работать с обещаниями, создавая новый поток из горной местности с обещанием и выполняя обещание путем его выравнивания.

Итак, я делаю в основном: создание обещаний, распараллеливание их потребления ив конце я хочу один поток [string, string[]] через flatten.

И все же фактическое поведение высокогорья противоречит моим ожиданиям.

Здесь мой код TypeScript демонстрирует мои ожидания:

import * as highland from "highland";

const somethingAsync = async (s: string): Promise<[string, string[]]> => {
    return [s, s.split("")];
};

const data = [
    "foo",
    "bar",
    "baz",
    "poit",
    "gnarf",
];

const stream: Highland.Stream<[string, string[]]> = highland(data)
    .map((input: string) => highland(somethingAsync(input))) // wrapping the promises into a highland stream
    .parallel(3) // processing it in parallel
    .flatten(); // flattening it to resolve the promises

stream.each((shouldBeATuple: [string, string[]]) => {
    console.log(shouldBeATuple);

    const [item1, item2] = shouldBeATuple;
    console.log(item1, item2);
});

Я ожидаю, что должен BeEATuple быть кортежем.Но вместо этого я получаю поток всех элементов, как будто flatten слишком сильно выравнивается.

Я ожидаю, что он будет на первой итерации:

 ["foo", ["f","o","o"]];

и на второй:

 ["bar", ["b","a","r"]];

И все же вместо этого я получаю:

 "foo",

, а затем за ним следуют: "f", "o", "o", "bar", "b"," a "," r ".

Так что я полностью теряю кортежи и получаю один большой" беспорядок "потока со всеми элементами в нем.

Как я могу получитьпоток кортежей при использовании асинхронных функций?


Я обнаружил, что когда я не выравниваю поток, я получаю свой результат, но машинопись выдает ошибку:

15 const stream: Highland.Stream<[string, string[]]> = highland(data)
         ~~~~~~
src/tuple.ts(15,7): error TS2322: Type 'Stream<Stream<[string, string[]]>>' is not assignable to type 'Stream<[string, string[]]>'.
  Type 'Stream<[string, string[]]>' is not assignable to type '[string, string[]]'.
    Property '0' is missing in type 'Stream<[string, string[]]>'.

1 Ответ

0 голосов
/ 19 сентября 2018

Объявление типа для parallel неверно.Когда это исправлено, ваш код проходит проверку типа без flatten.Я отправил запрос на получение для исправления набранных текстов;оттуда вы можете добавить копию исправленных текстов в ваш проект.

...