javascript - Promise.all([...]) 填充对象

标签 javascript promise

我有一个包含一些 ID 的对象,我需要通过在不同的端点获取这些 ID 来替换为它们的关联对象。

{
  user: 123456
  items: [
    1234,
    4321,
  ]
}

我想获取它,其中 a 是端点 GET/user 的 userId 和 GET/item 的每个项目 ID。我希望返回一个完整的对象,例如:

{
  user: { ... }
  items: [
    { ... } 
    { ... } 
  ]
}

我所有的用户和项目功能都可以工作并且正在使用异步获取所以我想我想要一些类似的东西:

const fillIn = async data => {
  return Promise.all(
    data.map(async obj => {
      const userId = obj.userId;
      const itemIds = obj.items
      return Promise.all([
        getUser(creatorId),
        Promise.all(itemIds.map(item => getItem(item)))
      ]);
    })
  );
};

我的问题是 promise.all 返回了什么,什么时候返回?我一直在获取 Unresolved 函数,但我认为它的全部意义在于解决所有的 promise !?

最佳答案

您需要的函数返回一个由“填充”对象实现的 promise 。该 promise 实际上是 promise 的组合:一个用于用户,一个数组用于 items 中的每个项目...

function fillIn(object) {
    let filledInObject = { user:null, items:[] };
    let promises = object.items.map(i => {
        return getItem(i).then(item => filledInObject.items.push(item));
    });
    let userPromise = getUser(object.user).then(user => {
        filledInObject.user = user;
    });
    promises.push(userPromise);
    return Promise.all(promises);
}

人们还可以想象一个更通用的解决方案,其中属性名称被映射到某些配置对象中的 getter:

// getUser and getItem are assumed as above
// add a plural form for getItems
// our getters will be indexed like this: { user:getUser, items:getItems }

function getItems(array) {
    let promises = array.map(i => getItem(i));
    return Promise.all(promises);
}

现在,一个通用的填充物内部...

function fillIn(object, getters) {
    let filledInObject = {};
    let promises = Object.keys(object).map(key => {
        let getter = getters[key];    // lookup a promise-returning function for the key
        // call it with the param in the object, use the result to fill-in the target object
        return getter(object[key]).then(result => {
            filledInObject[key] = result;
        });
    });
    return Promise.all(promises);
}

这样调用它:

const getters = { user:getUser, items:getItems }
let opObject = { user: 123456, items: [ 1234, 4321 ] };

fillIn(opObject, getters).then(filledInObject => {
    console.log(filledInObject);
})

关于javascript - Promise.all([...]) 填充对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50806753/

相关文章:

javascript - JavaScript 中的正则表达式

javascript - Promisifying XMLHttpRequest 时,如何捕获抛出错误

Javascript 等待 Promises 返回数据,然后分配 onClick 事件监听器以对返回的数据执行操作

javascript - 有没有什么情况不能用Promise,必须用Deferred?

node.js - Node Js 链接响应

javascript - Java 和 typescript 生成差异 PBKDF2 哈希

javascript - 将鼠标悬停在超链接上时如何隐藏 URL?

javascript - D3JS : Interpolating missing time value as null in time series data

javascript - 传递值时的顺序 Promise

javascript - 递归展开嵌套数组