lodash mapValues async

里面_.mapValues我想获得一些修改的值与一些延迟(例如从数据库),但我面临的问题:当我修改值在同步模式一切都很好,当我尝试使用承诺或callback其工作不正确(在第一种情况我得到Promise对象,第二种:未定义的值)。 这里有一些简化的例子,我如何重写mapValues中的代码来解决这个问题?

'use strict'; const _ = require('lodash'); const Promise = require('bluebird'); let obj = { one: 1, two: 2, }; let increment = (value) => { return value + 1; }; let incrementProm = (value) => { return Promise.resolve(value + 1); }; let incrementCb = (value, cb) => { let res = value + 1; let err = null; setTimeout(cb.bind(undefined, err, res), 100); }; let t1 = _.mapValues(obj, (value) => { return increment(value); }); let t2 = _.mapValues(obj, (value) => { return incrementProm(value); }); let t3 = _.mapValues(obj, (value) => { let temp; incrementCb(value, (err, res) => { temp = res; }); return temp; }); console.log('Sync res:'); console.log(t1); console.log('Promise res:'); console.log(t2); console.log('Callback res:'); console.log(t3); 

你可以使用蓝鸟的props()函数来parsing带有promise的所有属性。

 Promise.props(_.mapValues(obj, incrementProm)) .then(result => console.log(result)); 
 var obj = { one: 1, two: 2 }; var incrementProm = value => Promise.resolve(value + 1); Promise.props(_.mapValues(obj, incrementProm)) .then(result => console.log(result)); 
 <script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.4.1/bluebird.js"></script> 

你正在映射到承诺,所以我做的事情可能是:

 var _ = require('lodash'); let incrementProm = (value) => { return Promise.resolve(value + 1); }; let obj = { foo: 1, bar: 2 } let keys = _.keys(obj); let promises = _.map(keys, k => { return incrementProm(obj[k]) .then(newValue => { return { key: k, value: newValue } }); }) Promise.all(promises).then(values => { values.forEach(v => obj[v.key] = v.value) }) .then(() => { // now your object is updated: foo = 2 and bar = 3 console.log(obj); });