2017-01-05 2 views
2

У меня есть поток плоскогорье, в котором каждый элемент является обещание для запроса GET:Как разрешить обещания в потоке?

const stream = _[promise1, promise2, promise3, ...]; 

так, конечно, когда я бегу:

const stream.each(console.log) 

Я вижу только:

Promise { <pending> } 
Promise { <pending> } 
Promise { <pending> } 

Но я хочу создать конвейер и поработать над фактическим результатом обещания. (Я не хочу использовать then или await). Я хочу решить эти обещания через потоковый конвейер.

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

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

Я пробовал:

stream.flatMap((id: number) => { 
    return myAsyncGetRequest(id); 
}).each(console.log) 

Как разрешить обещания в потоке?

+0

Это кажется связанным reahttp: //stackoverflow.com/questions/25638527/using-highland-js-to-perform-async-tasks-in-series-with-references-to-original-s – k0pernikus

ответ

0

я споткнулся вопрос GitHub и там the answer of quarterto просветил меня:

Нужно обернуть обещание внутри нагорья для flatMap работать, как ожидалось:

stream.flatMap((id: number) => { 
    return Highland(myAsyncGetRequest(id)); 
}).each(console.log) 

Нить также проливает свет на то, почему обещания не ждут.

quarterto сформулировал это так:

Хайленд не является библиотекой Promise. Он может потреблять обещания, например, потребляет массивы, обратные вызовы и эмитенты событий, но его API сфокусирован вокруг преобразования потоковых значений, а не обещаний. Это похоже на запрос , почему Array.prototype.map не ждет обещаний или почему Bluebird не ждет Streams.

Или как сказал vqvu:

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

0

Highland не подходит для ваших нужд слишком много, хотя я думаю, что это возможно.

Взгляните на scramjet, это структура, построенная поверх стандартных потоков узлов, таких как Highland, но основана на обещаниях работать в асинхронных случаях точно так же, как и синхронные.

Вот как бы вы работать на свои обещания в ГПВРД:

const scramjet = require("scramjet"); 

const stream = scramjet.DataStream.fromArray([d1, d2, d3]) 
        .map((data) => aCallThatReturnsAPromise(data)) 
        .stringify((resolved) => JSON.stringify(resolved) + "\n") 
        .pipe(fs.createWriteStream('./yourfile.jslines'); 

Так как нагорья и ГПВРД работы на верхней части узла потоков, вы можете легко трубы к предыдущему трубопроводу, если вам нравится. И он не имеет зависимостей, поэтому вы не будете делать программное обеспечение вдвое тяжелее. :)

Смежные вопросы