javascript - Promise.all() 用于具有多个参数的 Promise

标签 javascript es6-promise

我正在使用来自服务器的数据动态构建条目列表。

每个条目都可以有一个父条目。我想通过搜索它的 ID 从 DOM 中获取父名称。如果父条目已经在页面上,那么这一切都很好。如果不是,那么它当然会失败。

<div class="the_entry">
  <h4></h4>
  <select></select>
</div>
<script>
  const the_entry = document.querySelector('.the_entry');
  const parsed_data_from_server = [
    { entry_id: 0, entry_name: "zero", parent_id: 2},
    { entry_id: 1, entry_name: "one", parent_id: 2},
    { entry_id: 2, entry_name: "two", parent_id: 2},
  ];

  parsed_data_from_server.foreach((entry_from_the_server) => {
    // new div
    const new_entry = the_entry.cloneNode(true);
    the_entry.parentNode.insertBefore(new_entry, the_entry);
    new_entry.querySelector('h4').innerText = entry_from_the_server.entry_name;
    new_entry.querySelector('h4').id = entry_from_the_server.entry_id;
    // new option
    const new_option = document.createElement('option');
    new_entry.querySelector('select').appendChild(new_option);
    new_option.value = entry_from_the_server.parent_id;
    const name = document.querySelector(`[id="${entry_from_the_server.parent_id}"]`)
    new_option.innerText = name.innerText; // this will fail because no element with that id exists YET
  });
</script>

所以我想在处理列表后使用 Promise 创建选项元素。但要做到这一点,我需要传递new_entry和entry_from_the_server。

这是我尝试过的...

let promises = [];
parsed_data_from_server.forEach((entry_from_the_server) => {
    // new div
    const new_entry = the_entry.cloneNode(true);
    the_entry.parentNode.insertBefore(new_entry, the_entry);
    new_entry.querySelector('h4').innerText = entry_from_the_server.entry_name;
    new_entry.querySelector('h4').id = entry_from_the_server.entry_id;
    // create a promise
    promises.push(new Promise((resolve, reject) => {
        resolve(new_entry, entry_from_the_server);
    }));
} );

Promise.all(promises).then((new_entries) => {
    new_entries.forEach((new_entry) => {
        // new option
        const new_option = document.createElement('option');
        new_entry.querySelector('select').appendChild(new_option);

        // where do I get entry_from_the_server from?!
        new_option.value = entry_from_the_server.parent_id;
        new_option.innerText = document.querySelector(`[id="${entry_from_the_server.parent_id}"]`).innerText;
    })
} );

一切都很好,直到最后一部分......我从哪里得到第二个参数?这可能吗?

最佳答案

函数resolve采用单个参数,如果传递多个参数,则第一个参数将被视为,其余参数将被忽略。在您的情况下,您可以发送一个对象:

promises.push(new Promise((resolve, reject) => {
     resolve({new_entry, entry_from_the_server});
}));

在解析值中,您将获得一个数组,第一个索引将具有 new_entry,第二个索引将具有 entry_from_the_server:

Promise.all(promises).then((new_entries) => {
    //using destructuring
    new_entries.forEach(({new_entry, entry_from_the_server}) => {
        // new option
        const new_option = document.createElement('option');

        new_entry.querySelector('select').appendChild(new_option);

        new_option.value = entry_from_the_server.parent_id;
        new_option.innerText = document.querySelector(`[id="${entry_from_the_server.parent_id}"]`).innerText;
    })
} );

关于javascript - Promise.all() 用于具有多个参数的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57543442/

相关文章:

javascript - 在 Shiny 环境中将 Leaflet 控件放在 map div 之外

node.js - nodejs mongodb es6-promises 获取带有外键数据的列表

javascript - 将 forEach() 与 promise 一起使用,同时在 .then() 链中访问先前的 promise 结果?

javascript - 努力实现 promise

javascript - 通过jquery获取包含相同类的不同隐藏值

javascript - AccessDenied 根据策略 : Policy Condition failed: ["eq", "$success_action_redirect"、 "http://localhost/"无效]

javascript - 使一个元素相对于另一个元素居中

javascript - Firebase 网站 : upload multiple files to Storage an then download their URLs

javascript - Promise returns in a chain 的误解

javascript - 鼠标滚动不适用于 Google map 上附加的 div