首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lodash异步

lodash异步
EN

Stack Overflow用户
提问于 2016-06-30 13:59:42
回答 3查看 3.3K关注 0票数 4

在_.mapValues内部,我希望获得一些具有一些延迟的修改值(例如从DB),但我遇到了问题:当我以同步模式修改值时,一切都很好,当我尝试使用允诺或不正确地回调它的工作时(在第一种情况下,我得到了允诺对象,第二种是未定义的值)。这里有一些简化的例子,我如何在mapValues中重写代码来解决这个问题?

代码语言:javascript
复制
'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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-30 15:27:00

您可以使用蓝知更鸟的道具()函数来解析所有的承诺属性。

代码语言:javascript
复制
Promise.props(_.mapValues(obj, incrementProm))
.then(result => console.log(result));

代码语言:javascript
复制
var obj = {
  one: 1,
  two: 2
};

var incrementProm = value => Promise.resolve(value + 1);

Promise.props(_.mapValues(obj, incrementProm))
.then(result => console.log(result));
代码语言:javascript
复制
<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>

票数 4
EN

Stack Overflow用户

发布于 2016-06-30 14:13:35

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

代码语言:javascript
复制
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);
});
票数 2
EN

Stack Overflow用户

发布于 2020-12-03 16:12:10

您可以实现mapValues的异步版本。就像..。

代码语言:javascript
复制
async function mapValuesAsync(object, asyncFn) {
  return Object.fromEntries(
    await Promise.all(
      Object.entries(object).map(async ([key, value]) => [
        key,
        await asyncFn(value, key, object)
      ])
    )
  );
}

然后像你叫_.mapValues那样叫它

代码语言:javascript
复制
let t2 = await mapValuesAsync(obj, (value) => {
    return incrementProm(value);
});

或者,简单地

代码语言:javascript
复制
let t2 = await mapValuesAsync(obj, incrementProm);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38125401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档