gpt4 book ai didi

javascript - 尝试在循环中等待对象的元素

转载 作者:行者123 更新时间:2023-12-01 01:37:17 24 4
gpt4 key购买 nike

我正在调用返回字段列表的 API。其中一些字段具有相关字段,我也需要查询 API 来获取这些字段。

这就是我正在尝试做的事情(主要是伪代码):

// gets initial set of fields. This part works.
let fields = await getFields();
processFields(fields).then(data => {
console.log('data now contains object with all fields and related fields', data);
});

async function processFields(fields) {
let fieldObj = {};

return new Promise(resolve => {
fields.forEach(async field => {
if (field.collection) {
let related = await getRelated(field.relatedListFieldType);
fieldObj[field.id] = {
name: field.name,
display: field.display,
fields: related
};
} else {
fieldObj[field.id] = {name: field.name, display: field.display};
}
});

resolve(fieldObj);
});
}

async function getRelated(name) {
… some code here and return promise …
}

我遇到的问题是 forEach 不会等待,因此在放入第一个 console.log 时,除了具有集合的字段之外,我得到了我期望的所有结果。因为我正在等待这些,所以它永远不会被输入到返回的 fieldObj 中。如果我不在那里等待,我会在 fieldObj 中获取它们,但是当我打印它们时,它们只是 promise 。我一直在尝试使用 bluebird 和 async npm 库来尝试获取一个在解析之前等待结果的 foreach,但没有成功。我该怎么做才能度过这个难关?

使用新代码进行编辑:

async function processFields(data) {

let fieldObj = {};

for (let field of data.data) {
if (field.isCollection) {
let related = await getRelated(field.relatedListFieldType);
fieldObj[field.id] = {
name: field.name,
display: field.display,
fields: related
};
} else {
fieldObj[field.id] = {
name: field.name,
display: field.display
}
}
}

return fieldObj;
}

async function getRelated(name) {
let relatedData = '';

name = name.toLowerCase();
if (objects[name]) {
return objects[name];
} else {
// put a placeholder here so we only request this once
objects[name] = {};
}

return new Promise(resolve => {
let relatedOptions = Object.assign(options, {
path: encodeURI(`/api/objects/v1/${name}/_describe`)
});

let req = https.request(relatedOptions, res => {
res.on('data', chunk => {
relatedData += chunk;
});

res.on('error', err => {
console.log('had error', err);
});

res.on('end', async () => {
objects[name] = await processFields(JSON.parse(relatedData));
resolve(objects[name]);
});
});

req.end();
});
}

最佳答案

使用for,而不是.forEach()来让循环等待await.forEach() 未设计为通过 await 暂停。

也没有理由创建自己的 promise 。 async 函数已经返回一个 promise ,因此您只需使用 await ,然后返回一个值,该值将自动成为返回的 async 的解析值 promise 。

例如,您可以这样做:

async function processFields(fields) {
let fieldObj = {};

for (let field of fields) {
if (field.collection) {
let related = await getRelated(field.relatedListFieldType);
fieldObj[field.id] = {
name: field.name,
display: field.display,
fields: related
};
} else {
fieldObj[field.id] = {name: field.name, display: field.display};
}
}
return fieldObj;
}

关于javascript - 尝试在循环中等待对象的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52711879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com