如何将结果从promise返回到map函数

时间:2016-03-19 23:06:10

标签: javascript node.js rethinkdb

我有一个javascript承诺,我希望将值返回到map函数,更容易看到,而不是用第二个promise来解释问题。我知道我无法从承诺内部返回价值,但我问是否有更好的解决方案。感谢

我的代码:

                user.contacts = _map(user.contacts, (contact) => {
                    this.findById.then((user) => {
                        contact.user = user
                    })
                    return contact
                })

问题在这里:

Animal *heapAllocatedAnimal = malloc(sizeof(Animal));
memcpy(heapAllocatedAnimal,&a,sizeof(Animal));

1 个答案:

答案 0 :(得分:0)

由于您使用的是When promise库,因此您应该使用自己的迭代器(例如mapreduce)来处理数组。

有一点非常重要,值得注意的是,当map运行"机会主义" (并行运行所有内容),reduce串行运行,没有重叠。换句话说,如果您有一个包含1000个用户的数组,map将(可能)一次向您的数据库发送1000个请求,而reduce将完成,直到它完成每个数据库请求反过来。

所以你的代码可能如下所示:

// This mutates user.contacts, so you don't need to worry about the
// 'initial value' in your reducer function
When.reduce(user.contacts, (carry, contact) => {
     return this.findById.then((user) => {
         contact.user = user
     })
 });

如果您确实需要处理大量用户,那么将数据块化为一个较小的,合理大小的数组可能更有意义;你会reduce块和map每个块中的用户。这意味着可以比串行完成更快地处理数组,但没有任何冲洗数据库的风险。

修改

// This mutates user.contacts, so you don't need to worry about the
// 'initial value' in your reducer function
// It also returns the array of users as `allContacts`
var allContacts = When.reduce(user.contacts, (carry, contact) => {
     return this.findById.then((user) => {
         contact.user = user
         carry.push(user);
         return carry;
     })
 }, []);