添加 Gatsby 节点字段时的异步/承诺问题



我在向Gatsby节点添加一些字段时遇到了一些问题。真正的问题归结为这样一个事实,即我似乎无法理解异步情况,因为我是从 API 调用结果创建这些字段的。我仍在尝试了解承诺/异步/等。

我对 API 进行一次 API 调用以获取位置信息并将其添加为字段(locationRequest,工作正常(,然后运行另一个调用以获取在该位置工作的正畸医生。

当getOrthos运行时,它到达控制台.log应该吐出一系列正畸实体,我得到的是:

Created Ortho Node... [ Promise { <pending> }, Promise { <pending> } ]

我做错了什么?我尝试浏览一些 Promise 教程,但我无法找出执行此操作的最佳方法,它返回的是实际数据而不是 Promise。

感谢您提供的任何指导,请原谅我的无知。


const yextOrthos = node.acf.location_orthodontists;
const locationRequest = async () => {
const data = await fetch("https://FAKEURL.COM")
.then(response => response.json());
if( data && data.response && data.response.count === 1 ){
createNodeField({
node,
name: `yextLocation`,
value: data.response.entities[0]
});
} else {
console.log("NO LOCATIONS FOUND");
}
};
const getOrthos = async () => {
let orthodontists = await yextOrthos.map( async (ortho, i) => {
let orthoID = ortho.acf.yext_entity_ortho_id;
return await orthoRequest(orthoID);
});
if( orthodontists.length ){
createNodeField({
node,
name: `yextOrthos`,
value: orthodontists
});
console.log("Created Ortho Node...", orthodontists);
} else {
console.log("NO DOCTORS FOUND");
}
};
const orthoRequest = async (orthoID) => {
const dataPros = await fetch("https://FAKEURL.COM").then(response => response.json());
if( dataPros && dataPros.response && dataPros.response.count === 1 ){
return dataPros.response.entities[0];
} else {
return;
}
}
locationRequest();
getOrthos();

你需要记住的是,等待应该只站在承诺或回报承诺的东西之前。Array.prototype.map()返回array因此您无法直接将 await 与它一起使用。 另一方面,Promise.all()接受数组并返回一个承诺。何塞·巴斯克斯举的例子似乎已经足够了。

祝你好运

你应该使用 Promise.all(( 作为数组,在这样的行:

let orthodontists = await Promise.all(yextOrthos.map( async (ortho, i) => {...});

我希望它有所帮助!

编辑:

将使用异步返回的值解析的承诺 函数,或因从内部引发未捕获的异常而被拒绝 异步函数。

如果您希望并行完全执行两个或多个作业,则必须 使用 await Promise.all([job1((, job2((](,如并行所示 例。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

最新更新