【问题标题】:Resolve multiple Promises returning merged data解决多个返回合并数据的 Promise
【发布时间】:2020-01-25 18:00:19
【问题描述】:

我只是 JavaScript Promises 的初学者,尽管我在生活中广泛使用了它们,用于 AJAX 请求。

我正在构建一个从 SharePoint 库运行的前端应用程序,它从 SharePoint API 请求用户信息以自定义页面内容。为了获得我想要的所有信息,我需要获取 2 个不同的 URL,因为其中一个不包含我寻找的所有数据。

此外,我正在构建一个库来促进 SharePoint API 的使用,我希望这两个承诺能够在一个单一的承诺中得到解决,结果都已经合并到一个单一的 JSON userData 中。我知道Promise.all() 做了类似的事情,但是它的结果是一个具有单独结果的数组,这不符合我想要的第二部分......

另外,请记住,我正在构建一个与 IE 完全兼容的应用程序,因此放弃了很多资源,例如 Asyn/Await。

所以我希望下面的函数getUser() 已经返回带有合并对象属性的承诺:

function getUser() {
    var userData1 = axios.get(url + '/web/CurrentUser');
    var userData2 = axios.get(url + '/SP.UserProfiles.PeopleManager/GetMyProperties');

    return Promise.all([userData1, userData2]);
}

var userDataAll;
getUser().then(function(values) {
    userDataAll = Object.assign({}, values[0].data, values[1].data);
});

【问题讨论】:

  • 好的,那么问题到底出在哪里?你什么都没问,也没有提到代码是如何失败的。你是在问如何把数组变成getUser里面的一个对象?
  • 如果这是您的要求,您可以添加 .then(): jsfiddle.net/khrismuc/Lje73nuf
  • 我希望所有的 Promise 和合并都恢复到一个 Promise 中,结果可以在 .then() 中使用。答案/解决方案已分享

标签: javascript internet-explorer ecmascript-6 promise ecmascript-5


【解决方案1】:

我明白了!我理解了 Promise 的工作方式并自己找到了解决方案:我所需要的只是将这些步骤封装到一个新的 Promise 中,并在解决了 Promise.all() 并以 Object.assign() 结束合并后调用 resolve()callback:

function getUser() {
    return new Promise(function(resolve, reject) {
        var userData1 = axios.get(url + '/web/CurrentUser');
        var userData2 = axios.get(url + '/SP.UserProfiles.PeopleManager/GetMyProperties');
        Promise
            .all([userData1, userData2])
            .then(function(results) {
                let userData = Object.assign({}, results[0].data, results[1].data);
                resolve(userData);
            })
            .catch(function(errors) {
                reject(errors);
            });
    });
}

【讨论】:

  • 感谢您发布此问题的解决方案。我建议您在 48 小时后尝试将您自己的答案标记为该问题的可接受答案,此时该答案可以标记。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。
  • 是的,我会的!
  • 不需要新的承诺,就像我在小提琴中展示的那样:jsfiddle.net/khrismuc/Lje73nuf
  • 这些和我已经拥有的非常相似。我的问题不清楚,但我想要一个函数返回一个承诺,其中从提取操作收到的两个对象都已经合并。我发布的这个答案完全符合我的要求。但是感谢您的贡献...
  • 是的,但您不需要 new Promise() 包装器;而是简单地var userData1 = ...; var userData2 = ...; return Promise.all([userData1, userData2]).then(results => Object.assign(results[0].data, results[1].data));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2022-10-05
  • 2016-09-12
  • 1970-01-01
  • 2018-01-24
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多