[Compose] 18. Maintaining structure whilst asyncing

We take our Promise.all() analogy further by using traversable on a Map(). Then we use two traversals in the same workflow.

Traverse is good for maintaning the original data structure:

const Task          = require('data.task');
const { List, Map } = require('immutable-ext');

const httpGet = (path, params) => Task.of(`${path} result`);


// map
const res0 = Map(
    {
        home  : '/',
        about : '/about'
    }
).map(route =>
        httpGet(route, {})
);
console.log(res0); // Map{ home: Task(), about: Task()}

For example, the code here return Map({Task}) instead of Map({}). 

So we can actually replace map with traverse.

// Traverse
Map(
    {
        home: '/',
        about: '/about'
    }
).traverse(
    Task.of,
    route => httpGet(route, {})
).fork(console.error, console.log); // Map { "home": "/ result", "about": "/about result" }

Now we are able to keep the same structure as before.

We can also use double traverse if needed, for example we change data to array of path inside of string:

// Double traverse
Map(
    {
        home: ['/', '/home'],
        about: ['/about', '/help']
    }
).traverse(
    Task.of,
    routes =>
        List(routes)
            .traverse(
                Task.of,
                route => httpGet(route, {})
            )
).fork(
    console.error, console.log
); // Map { "home": List [ "/ result", "/home result" ], "about": List [ "/about result", "/help result" ] }

Because Array doesn't have traverse function, so we need to use List from immutable.

原文地址:https://www.cnblogs.com/Answer1215/p/6212763.html