即使返回值,异步函数也会返回未定义的

时间:2020-09-05 04:54:11

标签: javascript promise es6-promise

我有以下两个函数,一个函数调用另一个函数,但记录变量未定义,随后出现错误。我不知道为什么脚本不等待。似乎只是使用未定义的变量。

async function searchRecord(recordID) {
    client.search({
        index: 'records',
        type: 'record',
        body: {
            query: { match: { _id: recordID } }
        }
    }).then(result => {
        return result
    }).catch(error => {
        console.log(error)
        return []
    })
}

function test(jsonRecord) {
    const userID = jsonRecord.users[0]
    searchRecord(jsonRecord.objectID).then(record => {
        if (record.length === 0) {
            record = jsonRecord
        }
    })
}

我得到的错误是: UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“ length”

4 个答案:

答案 0 :(得分:2)

这是异步的,请尝试使用await

async function searchRecord(recordID) {
  try {
    const result = await client.search({
      index: 'records',
      type: 'record',
      body: {
        query: {
          match: { _id: recordID }
        }
      }
    });
    return result;
  } catch (error) {
    console.log(error);
    return [];
  }
}

答案 1 :(得分:1)

尝试将searchRecord更新为return

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 [];
    });
}

答案 2 :(得分:0)

函数#include <studio.h> int main() { int num; while(1) printf("Enter the number"); scanf("%d",num); printf("Your number is %d", num); return 0; } 返回一个Promise。您可以选择从client.search()退还该承诺。然后,在searchRecord()函数中处理catch

或者,您也可以通过实现try catch块来处理test()内部的错误。但是在这种情况下,关键是要等searchRecord()完成后再从client.search()返回。

searchRecord()

我得到的错误是:UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性'length'

这样做的原因是function searchRecord(recordID) { return client.search({ index: 'records', type: 'record', body: { query: { match: { _id: recordID } } } }); } function test(jsonRecord) { const userID = jsonRecord.users[0] searchRecord(jsonRecord.objectID).then(record => { if (record.length === 0) { record = jsonRecord } }).catch(error => { console.log(error) return [] }) } 返回的诺言立即解析为searchRecord()。函数undefined中没有return语句。

答案 3 :(得分:-1)

为什么不使用Promise?如果您想像上述答案一样使用async-await可以,但是使用Promise变得非常简单

function searchRecord (recordID) {
  return new Promise((resolve, reject)=>{
    client.search({
      index: 'records',
      type: 'record',
      body: {
        query: {
          match: { _id: recordID }
        }
      }
    }).then(
      result => resolve(result)
    ).catch(
      error => {console.log(error);reject());
  });
}


function test (jsonRecord) {
    const userID = jsonRecord.users[0]
    searchRecord(jsonRecord.objectID)
      .then(
        record => {
          if (record.length === 0) {
            record = jsonRecord
          }
        }
      )
  }