Javascript 异步函数返回未定义的值,即使返回值也是如此
我有以下两个函数,一个调用另一个,但记录变量未定义,后跟错误。我不明白为什么脚本不等待。它似乎只处理未定义的变量 异步函数searchRecord(recordID){ client.search({ 索引:'记录', 键入:“记录”, 正文:{ 查询:{match:{u id:recordID}} } })。然后(结果=>{ 返回结果 }).catch(错误=>{ console.log(错误) 返回[] }) } 功能测试(jsonRecord){ const userID=jsonRecord.users[0] searchRecord(jsonRecord.objectID)。然后(record=>{ if(record.length==0){ record=jsonRecord } }) } 我得到的错误是:Javascript 异步函数返回未定义的值,即使返回值也是如此,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我有以下两个函数,一个调用另一个,但记录变量未定义,后跟错误。我不明白为什么脚本不等待。它似乎只处理未定义的变量 异步函数searchRecord(recordID){ client.search({ 索引:'记录', 键入:“记录”, 正文:{ 查询:{match:{u id:recordID}} } })。然后(结果=>{ 返回结果 }).catch(错误=>{ console.log(错误) 返回[] }) } 功能测试(jsonRecord){ const userID=jsonReco
未经处理的PromisejectionWarning:TypeError:无法读取未定义的属性“length”请尝试将
searchRecord
更新到返回:
async function searchRecord(recordID) {
return client
.search({
index: "records",
type: "record",
body: {
query: {
match: { _id: recordID },
},
},
})
.then((result) => {
return result;
})
.catch((error) => {
console.log(error);
return [];
});
}
这是异步的,请尝试使用wait
异步函数searchRecord(recordID){
试一试{
const result=wait client.search({
索引:'记录',
键入:“记录”,
正文:{
查询:{
匹配:{u id:recordID}
}
}
});
返回结果;
}捕获(错误){
console.log(错误);
返回[];
}
}
为什么不使用承诺
?如果您想像上面的答案一样使用async wait
,这是可以的,但是使用Promise
变得非常简单
函数搜索记录(recordID){
返回新承诺((解决、拒绝)=>{
client.search({
索引:'记录',
键入:“记录”,
正文:{
查询:{
匹配:{u id:recordID}
}
}
}).那么(
结果=>解析(结果)
).接住(
error=>{console.log(error);reject());
});
}
功能测试(jsonRecord){
const userID=jsonRecord.users[0]
searchRecord(jsonRecord.objectID)
.那么(
记录=>{
if(record.length==0){
record=jsonRecord
}
}
)
}
函数client.search()
返回一个承诺。您可以选择从searchRecord()
返回该承诺,然后在test()函数中处理catch
或者,您也可以通过实现try-catch块来处理searchRecord()
中的错误。但这种情况下的关键是等待client.search()
完成,然后再从searchRecord()
返回
函数搜索记录(recordID){
返回client.search({
索引:'记录',
键入:“记录”,
正文:{
查询:{match:{u id:recordID}}
}
});
}
功能测试(jsonRecord){
const userID=jsonRecord.users[0]
searchRecord(jsonRecord.objectID)。然后(record=>{
if(record.length==0){
record=jsonRecord
}
}).catch(错误=>{
console.log(错误)
返回[]
})
}
我得到的错误是:UnhandledPromisejectionWarning:TypeError:无法读取未定义的属性'length'
原因是searchRecord()
返回的承诺会立即解析为undefined
。函数searchRecord()中没有返回语句
searchRecord忘记了返回任何内容。@tmhao2005async
函数总是返回一个承诺。在这种情况下,由于没有返回语句,函数将返回一个承诺,该承诺会立即解决未定义的问题。
。请不要鼓励这样做。大多数解决方案似乎有效,但这是e最容易实现。奇怪的是,这里需要顶部返回来实现这一点,但我猜.then和.catch all会将值返回给客户端。