我在一个异步函数内返回一个新的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)
})
这也删除了checkPriceId
的test
参数,因为它没有被使用。
作为@blex mentinoned,您不是在第13行调用checkPriceId。
然而,正如@grodzi所提到的,你不能多次resolve
你的承诺。一旦resolve
fn被调用一次(在第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
})