异步函数内部的新promise,以便获取异步函数外部的值



我在一个异步函数内返回一个新的Promis,该函数正在向api发出请求,我可以在函数内对来自api的请求进行控制台日志记录。但当我尝试解决同一行时,我安慰document.sold,它不起作用。我希望checkPriceId变量返回一个promise,然后我就可以使用.then了,但这似乎不起作用。我还尝试过在documents.forEach循环中使用promise.all,但没有成功。

如有任何帮助,我们将不胜感激。

这是代码

const checkPriceId = async test => {
return new Promise((resolve, reject) => {
const query = `*[_type == "products" && price_id == "${body.price_id}"]`
client.fetch(query, {}).then(documents => {
documents.forEach(document => {
//console.log(document.sold)
resolve(document.sold)
})
})
})
}
checkPriceId.then(test => {
console.log(test) // does nothing
})
console.log(checkPriceId) // just returns a async function
checkPriceId()

为什么要使用Promise构造函数?client.fetch已经返回了一个promise,并且您也在一个异步函数中,该函数也返回了promise。假设所有文档都有一个.sold,您正试图将其放回数组中:

const checkPriceId = async () => {
const query = `*[_type == "products" && price_id == "${body.price_id}"]`
const documents = await client.fetch(query, {})
return documents.map(({ sold }) => sold)
}
checkPriceId.then((soldList) => {
console.log(soldList)
})

这也删除了checkPriceIdtest参数,因为它没有被使用。

作为@blex mentinoned,您不是在第13行调用checkPriceId。

然而,正如@grodzi所提到的,你不能多次resolve你的承诺。一旦resolvefn被调用一次(在第7行),随后的调用将被忽略。

由于混合Promises和async的方式可能会很冗长和不透明,我建议您在这里只使用async/aviat。这将极大地帮助您的代码可读性。

这里有一个固定的例子:

const checkPriceId = async (test) => {

const query = `*[_type == "products" && price_id == "${body.price_id}"]`;
const documents = await client.fetch(query, {}); // this could throw
return documents.map(document => document.sold);
}
checkPriceId().then(test => {
console.log(test) // this will log the return value from line 7
})

相关内容

  • 没有找到相关文章

最新更新