js 获得了字符串但return 的值是"[object Promise]",怎么才能把字符串显示出来呢?

js 获得了字符串但return 的值是"[object Promise]"

const into = async (ids) => {
  const numbersArray = ids.split('').map(Number)
  const fetchData = async (number) => {
    if (number) {
      const data = await tubeApi.getAnyDevices({ id: number })
      return data && data.deviceName ? data.deviceName : ''
    }
    return ''
  }
  const result = Promise.all(numbersArray.map(fetchData))
  return (await result).filter(Boolean)
}
const intoText = async (ids) => {
  if (ids) {
    let getit = await into(ids)
    console.log(getit.join(','))
    return getit.join(',')
  }
}

打印结果没问题
image.png

看了一些帖子写成现在这样还是一样结果,我承认我对propmise的理解稀碎。。。怎么才能把字符串显示出来呢

阅读 1.5k
avatarAI BotBETA

在你的代码中,问题主要出在 into 函数中对 Promise.all 的处理上。Promise.all 会等待所有给定的 promise 完成后,将结果作为数组返回。然而,在你的 fetchData 函数中,如果 number 为 0 或者不满足某些条件时,fetchData 并没有返回任何值(即隐式地返回了 undefined)。此外,你在 .toString() 方法的使用上也不正确,因为它将整个数组转换为了字符串(例如 "undefined,device1,undefined,device2"),而不是你期望的单个字符串或每个设备名称的列表。

为了修正这个问题,你可以考虑以下几个步骤:

  1. 确保 fetchData 函数在所有情况下都返回一个值(比如当没有设备名称时返回空字符串或 null)。
  2. 修改 into 函数以正确处理和返回设备名称的数组,而不是尝试将整个数组转换为字符串。
  3. intoText 函数中,你可以遍历或连接这些设备名称来显示它们。

下面是修改后的代码示例:

const into = async (ids) => {
  const numbersArray = ids.split('').map(Number);
  const fetchData = async (number) => {
    if (number) {
      const data = await tubeApi.getAnyDevices({ id: number });
      return data && data.deviceName ? data.deviceName : ''; // 如果没有设备名称,返回空字符串
    }
    return ''; // 如果没有有效的 number,也返回空字符串
  };
  const results = await Promise.all(numbersArray.map(fetchData));
  return results.filter(Boolean); // 过滤掉空字符串或假值
};

const intoText = async (ids) => {
  if (ids) {
    let getit = await into(ids);
    console.log(getit.join(', ')); // 使用 join 方法将数组转换为由逗号分隔的字符串
    return getit.join(', '); // 如果你需要返回字符串
  }
};

// 使用示例
intoText('1234').then(console.log); // 假设 '1', '2', '3', '4' 是有效的设备 ID

在这个修改后的版本中,fetchData 总是返回一个字符串(设备名称或空字符串),into 函数返回所有有效设备名称的数组,并且 intoText 函数使用 join 方法将这些名称连接成一个由逗号分隔的字符串,并在控制台中打印出来。这样,你就可以在控制台中看到实际的字符串了。

3 个回答

intoText函数是async函数,他将返回一个promise,所以你不能直接将intoText的返回值赋值到某个变量上,应该在回调中进行赋值intoText().then(txt => xxx.xxx = txt)

文本 = '加载中'

promise
    .then(text => 文本 = text)
    .catch(err => {
            console.error(err)
            文本 = '出错了'
        })

是如何调用 intoText 的呢,调用的时候有没有加 await

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏