javascript - 从 Promise 设置对象数组

标签 javascript arrays reactjs

function getSuggestions(inputValue) {
  let results = [];
  axios.get(`${API_URL}?queryString=${inputValue}`)
    .then(({ data }) => {
      results = data;
    })
  let textValues = results.map(r => (textValues.push(r.text.toUpperCase())));
  //push all unique values to Set
  let uniqSet = new Set(textValues);
  //turn Set into Array object
  let uniqArr = Array.from(uniqSet)
  let suggestions = uniqArr.map(r => (suggestions.push({'label': r.text.toUpperCase()})));
  return suggestions.filter(suggestion => {
    const keep =
      (!inputValue || suggestion.label.toLowerCase().includes(inputValue.toLowerCase())) &&
      count < 5;

    if (keep) {
      count += 1;
    }

    return keep;
  });
}

我有这个函数来创建一个自动完成搜索组件,在该组件中我获取用户输入的 inputValue 并将其发送到端点,然后该端点返回搜索词的对象。

我正在尝试将其设置为空 results数组到data从我使用 axios 获取返回的对象。无论我尝试什么,结果数组始终保持为空。有什么建议么?先感谢您。

最佳答案

axios 代码是异步的,其余代码不是(并且不等待异步代码)。如果您不需要支持旧版浏览器,最好的选择是使用async/await

async function getSuggestions(inputValue) {
  let results = await axios.get(`${API_URL}?queryString=${inputValue}`).then(({ data }) => data)
  let textValues = results.map(r => (textValues.push(r.text.toUpperCase())));
  //push all unique values to Set
  let uniqSet = new Set(textValues);
  //turn Set into Array object
  let uniqArr = Array.from(uniqSet)
  let suggestions = uniqArr.map(r => (suggestions.push({'label': r.text.toUpperCase()})));
  return suggestions.filter(suggestion => {
    const keep =
      (!inputValue || suggestion.label.toLowerCase().includes(inputValue.toLowerCase())) &&
      count < 5;

    if (keep) {
      count += 1;
    }

    return keep;
  });
}

否则你的函数可能需要返回一个 promise ,因为结果是异步的:

function getSuggestions(inputValue) {
  return axios.get(`${API_URL}?queryString=${inputValue}`).then(({ data }) => {
    let textValues = data.map(r => (textValues.push(r.text.toUpperCase())));
    //push all unique values to Set
    let uniqSet = new Set(textValues);
    //turn Set into Array object
    let uniqArr = Array.from(uniqSet)
    let suggestions = uniqArr.map(r => (suggestions.push({'label': r.text.toUpperCase()})));
    return suggestions.filter(suggestion => {
      const keep =
        (!inputValue || suggestion.label.toLowerCase().includes(inputValue.toLowerCase())) &&
        count < 5;

      if (keep) {
        count += 1;
      }

      return keep;
    });
  })  
}

getSuggestions('test').then(keep => {
  // do something with response
})

关于javascript - 从 Promise 设置对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49037029/

相关文章:

php - Fetch API 无法加载 '.php' 本地文件 - React JS + PHP

javascript - 使用javascript在特定元素后插入div的最佳方法

php - 我什么时候应该在 php 中定义一个新数组?

c++ - 我找不到段错误?

arrays - KRL : Length of an array

javascript - 如何在nextjs中添加字体ttf文件

javascript - 类型错误 : Failed to execute 'fetch' on 'Window' : Invalid value

javascript - 使用下拉菜单更改窗口 URL?

javascript - 在 Javascript 中检查闭包中递增索引的最简洁方法?

javascript - 有没有办法可以使用 moment.js 获取(十月的第一个星期日 - 四月的第一个星期日)?