Javascript 使用香草承诺的RSVP哈希

Javascript 使用香草承诺的RSVP哈希,javascript,promise,async-await,rsvp.js,Javascript,Promise,Async Await,Rsvp.js,具有允许“检索”引用的帮助器: var承诺={ posts:getJSON(“/posts.json”), 用户:getJSON(“/users.json”) }; hash(承诺).then(函数(结果){ console.log(results.users)//打印users.json结果 console.log(results.posts)//打印posts.json结果 }); 有没有办法用香草承诺(在现代ES中)来做这样的事情呢?OOTB?不,只有Promise.all,但它接受数组

具有允许“检索”引用的帮助器:

var承诺={
posts:getJSON(“/posts.json”),
用户:getJSON(“/users.json”)
};
hash(承诺).then(函数(结果){
console.log(results.users)//打印users.json结果
console.log(results.posts)//打印posts.json结果
});

有没有办法用香草承诺(在现代ES中)来做这样的事情呢?

OOTB?不,只有
Promise.all
,但它接受数组,而不是字典。但是,您可以创建一个助手函数,该函数接受承诺字典,转换为数组,在其上运行
Promise.all
,并使用另一个
对其进行处理,然后将结果数组转换回字典。

这并不难实现

async function hash(promiseObj) {
  // Deconstitute promiseObj to keys and promises
  const keys = [];
  const promises = [];
  Object.keys(promiseObj).forEach(k => {
    keys.push(k);
    promises.push(promiseObj[k]);
  });
  // Wait for all promises
  const resolutions = await Promise.all(promises);
  // Reconstitute a resolutions object
  const result = {};
  keys.forEach((key, index) => (result[key] = resolutions[index]));
  return result;
}

hash({
  foo: Promise.resolve(8),
  bar: Promise.resolve(16),
}).then(results => console.log(results));

(如果目标运行时有
Object.entries,也可以使用它。)