中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在vue中使用promise異步請求數據

發布時間:2021-03-25 17:49:28 來源:億速云 閱讀:880 作者:Leah 欄目:web開發

本篇文章為大家展示了怎么在vue中使用promise異步請求數據,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

實現思路

在商品頁, created 鉤子函數觸發獲取分類的http請求,請求到結果后,開始請求所有的具體商品并渲染。

遇到的問題

?由于請求商品分類是異步的, 怎么判斷異步請求完成, 也就是說請求具體商品的時機是什么時候。
?獲取到所有的商品必須發送請求,請求時異步的,怎么保證能夠按照順序獲取到。

解決問題 --- 問題一

  針對問題一,最好的方式還是使用promise,大致實現如下:

 getClassify: function () {
 var that = this;
 // 使用promise處理異步。
 this.updateKinds().then(function () {
  console.log("獲取分類結束!");
  that.updateAllContent();
 });
 },

  其中getClassify是在created時就會調用的,而updateKinds是actions中的方法,我們先看看actions中是怎么寫的:

updateKinds ({commit, state}) {
 return new Promise(function (resolve, reject) {
 axios.get('/bbg/shop/get_classify', {
  params: {
  sid: 13729792
  } 
 })
 .then(function (response) {
  if (response.data.code == 130) {
  commit(UPDATE_KINDS, response.data.data)
  console.log(response.data.data);
  resolve()
  }
 }).catch(function (error) {
  console.log(error);
 });
 });

  即返回一個promise,當請求到數據,并且commit之后,我們就額可以resolve()了,這樣,就可以在then中執行獲取所有內容的方法了。

  雖然實現起來比較簡單,但是這個思想更好。

解決問題 --- 問題二

  在問題一中,我們看到resolve之后就可以調用updateAllContent() 了,那么這個應該怎么寫呢?

  首先可以確定的是: 因為需要請求的分類不只一個,所以要使用promise, 并且一定要返回一個promise,這樣才能繼續鏈式調用,其中一部分如下:

ar items = state.items;
 function getItemPromise(id) {
 return new Promise(function (resolve, reject) {
  var content = {
  "isSingle": 1,
  "sbid": 13729792,
  "catalog3": id,
  "offset": 0,
  "pageSize": 10
  };
  axios.post('/bbg/goods/get_goods_list_wechat', qs.stringify({"data": JSON.stringify(content)}))
  .then(function (response) {
  if (response.data.code == 626) {
  for (let i = 0; i < response.data.data.length; i++) {
  commit(UPDATE_ALL_CONTENT, response.data.data[i]);
  }
  resolve();
  }
  }).catch(function (error) {
  console.log(error);
  });
 });
 }

  即調用這個函數,傳入一個分類的id,然后就可以發送請求了,獲取到數據之后,就把數據插入到 內容的數組中, 最后resolve()還告訴then可以執行了。

  注意: 如何更新一個數組呢?

 [UPDATE_ALL_CONTENT] (state, item) {
 state.contentItems = [...state.contentItems, Object.assign({}, item)];
 },

  這樣就相當于push了。

 上面的這個函數的意義在于封裝請求,那么對于請求多個時,如何做到呢?

  我之前嘗試了下面兩種方法:

FIRST

 // first method
 var promise = getItemPromise(items[0].id)
 for (let j = 1; j < items.length; j++) {
 promise.then(function () {
  return getItemPromise(items[j].id);
 })
 }

 思路就是先請求第一個分類,然后循環,實際上和下面的效果是一樣的:

var promise = getItemPromise(items[0].id);
 promise.then(function () {
 console.log("1", window.performance.now());
 return getItemPromise(items[1].id);
 });
 promise.then(function () {
 console.log("2", window.performance.now());
 return getItemPromise(items[2].id);
 });
 promise.then(function () {
 console.log("3", window.performance.now());
 return getItemPromise(items[3].id);
 });
 promise.then(function () {
 console.log("4", window.performance.now());
 return getItemPromise(items[4].id);
 });
 promise.then(function () {
 console.log("5", window.performance.now());
 return getItemPromise(items[5].id);
 });
 promise.then(function () {
 console.log("6", window.performance.now());
 return getItemPromise(items[6].id);
 });

問題: 通過這樣的方法最終請求的數據是可以請求到的,但是順序并沒有按照我們預想的思路來執行,因為這樣的執行方式會在getItemPromise執行之后就立即同時執行后面幾個then,所以最終得到的順序是不能確定的。

方法二:

 // second method
 var somePromise = getItemPromise(items[0].id);
 for (let k = 1; k < items.length; k++) {
  somePromise = somePromise.then(function () {
  return getItemPromise(items[k].id);
 });
 }

 這種方法的結構類似于下面這樣:

getItemPromise(items[0].id)
 .then(function () {
 console.log("1", window.performance.now());
 return getItemPromise(items[1].id);
 })
 .then(function () {
 console.log("2", window.performance.now());

 return getItemPromise(items[2].id);
 })
 .then(function () {
 console.log("3", window.performance.now());

 return getItemPromise(items[3].id);
 })
 .then(function () {
 console.log("4", window.performance.now());

 return getItemPromise(items[4].id);
 })
 .then(function () {
 console.log("5", window.performance.now());

 return getItemPromise(items[5].id);
 })
 .then(function () {
 console.log("6", window.performance.now());

 return getItemPromise(items[6].id);
 })
 .then(function () {
 console.log("7", window.performance.now());

 return getItemPromise(items[7].id);
 })
 .then(function () {
 return getItemPromise(items[8].id);
 })
 .then(function () {
 return getItemPromise(items[9].id);
 })
 .then(function () {
 return getItemPromise(items[10].id);
 })
 .then(function () {
 return getItemPromise(items[11].id);
 })

  這樣請求得到的順序就是相同的了。 但是通過for循環,不論分類有多少,我們都可以請求到。

也就是說,通過鏈式調用的方式,即.then().then()這樣才會在一個異步執行完之后執行下一個,值得注意。

下面看下vue 中promise 異步請求數據的方法

export function getTypes(type) {
 return listDictItems({ code: type }).then((res) => {
 if (res.code == 200) {
  let list = res.body;
  // console.log('list',list);
  return list;
 }
 })
};

組件中:

getTypes('EP_TYPE').then((data) => {console.log('data',data)});//成功

上述內容就是怎么在vue中使用promise異步請求數據,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

郯城县| 古丈县| 杂多县| 吴川市| 阿图什市| 梅河口市| 涡阳县| 苍南县| 石河子市| 二连浩特市| 开化县| 邢台县| 连平县| 油尖旺区| 垫江县| 绥中县| 德格县| 西丰县| 望城县| 锦屏县| 拉萨市| 尼勒克县| 北宁市| 锡林浩特市| 重庆市| 迁安市| 沽源县| 盐山县| 白水县| 大邑县| 沛县| 呼和浩特市| 新干县| 文成县| 深泽县| 玛纳斯县| 清新县| 乌拉特后旗| 噶尔县| 固始县| 元氏县|