为了账号安全,请及时绑定邮箱和手机立即绑定

JS - 在继续下一部分之前未能正确解决一系列承诺

JS - 在继续下一部分之前未能正确解决一系列承诺

肥皂起泡泡 2022-12-29 16:18:30
我一直遇到有关 JS promise 使用的问题,希望这只是我遗漏了一些非常明显的东西。本质上,我尝试一次读取多个 JSON 文件并将它们的内容推送到属于另一个对象的数组,然后对该数组上的元素执行操作。因此,在尝试对其进行操作之前需要填充数组。然而,尽管我在理论上使用 promises 来确保顺序是正确的,但我所写的似乎无法做到这一点。我该如何解决这个问题?以下是我正在使用的代码片段,其中出现了问题:这是我将提取的对象推送到我的数组的函数:function pushNewRoom (ship, name_json_folder, elem, id) {  lt promiseRoom = new Promise ((resolve, reject) => {    let newRoom = gf.getJSONFile(name_json_folder + '/' + elem + ".json")        // note: getJSONFile allows me to grab a JSON object from a file      .then(        (data) => {          data.name = elem;          ship.rooms.push(data);          return data;      }).then((newRoom) => {          resolve(newRoom);      }).catch((reject) => {      // if the JSON file doesn't exist a default object is generated        let newRoom = new Room (elem, id);        ship.rooms.push(newRoom);        resolve(newRoom);      });  });  return promiseRoom;}这是调用该函数并执行我之后需要的操作的部分:exports.generateRoomsByLayout = function (name_json_folder, ship){        ship.rooms = [];        console.log("reached step 1");        // First execution step: get a JSON file        gf.getJSONFile(name_json_folder + "/_base_layout.json")        .then(function (shipmode){        // Note: shipmode is a JSON object that acts as a blueprint for the operations to follow.        // Importantly here, it contains an array, layout, containing the names of every other JSON file I will need to perform the operations.        console.log("reached step 2");              }).catch((err) => {              });        });};这个问题就发生在 Promise.allSettled() 行。程序没有等待 ship.layout.map() 生成的 promise,它会变成一个可迭代的数组,而是继续执行。我想这是因为 Promise.allSettled() 没有等待 map() 生成数组才继续前进,但一直无法解决问题,并且仍然怀疑这是解释。谁能告诉我我在这里做错了什么?如果我问的不清楚,请告诉我,我会尽力澄清。编辑:我怀疑它链接到 Promise.allSettled() 而不是等到 map() 填充数组以考虑数组内的每个承诺都已解决,因为它的长度在第 3 步似乎为 0,但我不确定。
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

没关系,我是个白痴。

map() 方法的回调(?)不会(显然)返回一个对象(因此,一个承诺)如果你不告诉它。所以,

shipmode.layout.map(function (elem, index){pushNewRoom(ship, name_json_folder, elem, index);})

需要是

shipmode.layout.map(function (elem, index){return pushNewRoom(ship, name_json_folder, elem, index);})


查看完整回答
反对 回复 2022-12-29
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信