请问一个Promise 的问题?

  home_barlist1: function home_barlist1() {
    //获取中间导航 
    var that = this;
    _wxRequest2.default.post({
      'url': _api2.default.home_barlist,
      'data': {
        show_type: 4
      }
    }).then(function (res) {
      if (res.code == 100) {
        var homelist = res.data;
        that.setData({
          homelist1: homelist
        });
      } else {
        _tip2.default.toast(res.data);
      }
    });
  },

请问上面这段代码,我想封装成Promise 这种 直接调用this.home_barlist1().then 该怎么改呢?

我改成下面这样 好像不行

 home_barlist1: function home_barlist1() {
    //获取中间导航 
  return new Promise(function (resolve, reject) {
    var that = this;
    _wxRequest2.default.post({
      'url': _api2.default.home_barlist,
      'data': {
        show_type: 4
      }
    }).then(function (res) {
      if (res.code == 100) {
        var homelist = res.data;
        that.setData({
          homelist1: homelist
        });
        resolve(res);
      } else {
        _tip2.default.toast(res.data);
      }
    });
   });
 },
阅读 710
avatarAI BotBETA

你的封装基本上是正确的,但是需要注意的是,当你返回一个新的Promise时,你需要确保在所有可能的执行路径上都调用resolvereject。在你的代码中,如果res.code不等于100,你没有调用resolvereject,这可能会导致Promise永远不会被解决或拒绝。

你可以通过在else语句块中调用reject来解决这个问题。这样,如果请求失败(即res.code不等于100),Promise将被拒绝,并且你可以在调用this.home_barlist1()时使用.catch()来处理这个错误。

以下是修改后的代码:

home_barlist1: function home_barlist1() {
  // 获取中间导航 
  return new Promise(function (resolve, reject) {
    var that = this;
    _wxRequest2.default.post({
      'url': _api2.default.home_barlist,
      'data': {
        show_type: 4
      }
    }).then(function (res) {
      if (res.code == 100) {
        var homelist = res.data;
        that.setData({
          homelist1: homelist
        });
        resolve(res);
      } else {
        _tip2.default.toast(res.data);
        reject(new Error(res.data));  // 在这里调用reject
      }
    });
  });
}

现在,你可以像这样调用home_barlist1函数并处理返回的Promise:

this.home_barlist1().then(function(res) {
  // 处理成功的情况
}).catch(function(error) {
  // 处理失败的情况
});
2 个回答

image.png

你这不本来就是一个 Promise 么?直接把箭头处 return 出去就不完了?

新手上路,请多包涵

尝试这样看看

  home_barlist1: function home_barlist1() {
    //获取中间导航 
    var that = this;
    return _wxRequest2.default.post({
      'url': _api2.default.home_barlist,
      'data': {
        show_type: 4
      }
    }).then(function (res) {
      if (res.code == 100) {
        var homelist = res.data;
        that.setData({
          homelist1: homelist
        });
        return res
      } else {
        _tip2.default.toast(res.data);
        return Promise.reject(res)
      }
    });
  },
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题