Javascript 异步函数返回未定义的值,即使返回值也是如此

Javascript 异步函数返回未定义的值,即使返回值也是如此,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我有以下两个函数,一个调用另一个,但记录变量未定义,后跟错误。我不明白为什么脚本不等待。它似乎只处理未定义的变量 异步函数searchRecord(recordID){ client.search({ 索引:'记录', 键入:“记录”, 正文:{ 查询:{match:{u id:recordID}} } })。然后(结果=>{ 返回结果 }).catch(错误=>{ console.log(错误) 返回[] }) } 功能测试(jsonRecord){ const userID=jsonReco

我有以下两个函数,一个调用另一个,但记录变量未定义,后跟错误。我不明白为什么脚本不等待。它似乎只处理未定义的变量

异步函数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 } }) } 我得到的错误是:
未经处理的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忘记了
返回任何内容。@tmhao2005
async
函数总是返回一个承诺。在这种情况下,由于没有返回语句,函数将返回一个承诺,该承诺会立即解决
未定义的问题。
。请不要鼓励这样做。大多数解决方案似乎有效,但这是e最容易实现。奇怪的是,这里需要顶部返回来实现这一点,但我猜.then和.catch all会将值返回给客户端。