uniapp的request请求的Promise 封装出错问题?

// Promise
uni.request({
    url: "https://unidemo.dcloud.net.cn/api/news",
  })
  .then((data) => {
    // data为一个数组
    // 数组第一项为错误信息 即为 fail 回调
    // 第二项为返回数据
    var [err, res] = data;
    console.log(res);
  });

// Await
async function request() {
  var [err, res] = await uni.request({
    url: "https://unidemo.dcloud.net.cn/api/news",
  });
  console.log(res);
}

照着官方文档这样写不管是上面的方法还是下面的都是会报错的,报错信息如下:
Uncaught (in promise) TypeError: Invalid attempt to destructure non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.

阅读 5k
4 个回答

找到问题了,创建项目的时候main.js有个promise请求默认会转成vue3的格式,把那个转换代码删了就可以用了

从报错信息看data并不是一个数组,你打印看下就行了

你不要先急着解构,

var response = await uni.request({
    url: "https://unidemo.dcloud.net.cn/api/news",
  });

console.log(response) 看看返回的到底是个什么

这个错误信息是因为你尝试对一个非可迭代对象进行解构赋值。在你的代码中,data是一个数组,但是它的第一项并不是一个可迭代对象,所以在尝试解构赋值时会报错。

如果你想要获取data数组中的第二项,可以直接使用索引访问,例如:

// Promise 
uni.request({ url: "https://unidemo.dcloud.net.cn/api/news", }).then((data) => {
    // data为一个数组 
    // 数组第一项为错误信息 即为 fail 回调 
    // 第二项为返回数据 var res = data[1]; console.log(res); 
});

// Await 
async function request() {
    var data = await uni.request(
        { url: "https://unidemo.dcloud.net.cn/api/news", });
    var res = data[0]; 
    console.log(res);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题