在_.mapValues内部,我想获得一些修改过的值,但有一些延迟(例如从DB),但我遇到了问题:当我在同步模式下修改值时,一切都很好,当我尝试错误地使用承诺或回调其工作时(在第一种情况下,我得到了承诺对象,在第二种情况下:下面是一些简单的例子,我如何在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);
4条答案
按热度按时间v9tzhpje1#
可以使用bluebird的props()函数解析所有带有promise的属性。
x一个一个一个一个x一个一个二个x
vfh0ocws2#
你在Map承诺,所以我可能会做些什么:
whitzsjs3#
你可以实现一个mapValues的异步版本。
然后像调用
_.mapValues
一样调用它:或者简单地说
368yc8dk4#
下面是一个TypeScript解决方案,构建在lodash函数之上:
如果您不需要类型,下面是JavaScript版本:
如果你需要的话,这里有一个测试:
这是受到了Rui Castro回应的启发,Rui Castro巧妙地使用了
Object.entries
和Object.fromEntries
。然而,这需要es2019或更高版本才能工作。Lodash有等效的函数toPairs
和fromPairs
,它们可以与任何风格的JavaScript一起工作。