模块化封装jsonp

这里我们调用的是qq音乐的数据

一、创建jsonp.js

import originJsonp from 'jsonp'
export default function jsonp(url, data, option) {
  url += (url.indexOf('?') < 0 ? '?' : '&') + param(data)
  return new Promise((resolve, reject) => {
    originJsonp(url, option, (err, data) => {
      if (!err) {
        resolve(data)
      } else {
        reject(err)
      }
    })
  })
}
export function param(data) {
  let url = ''
  for (var k in data) {
    let value = data[k] !== undefined ? data[k] : ''
    url += '&' + k + '=' + encodeURIComponent(value)
  }
  return url ? url.substring(1) : ''
}
涉及到url拼接,需要注意的是,data[k]可能为unifined,需要用substring截掉第一个&,还要判断拼接前是否有?,有?就用&,没有就用?。

然后用promise,判断是否成功。

二、recommend.js 和 config.js

这里我们首先将一些默认配置写到config文件,

export const commonParams = {
  g_tk: 5381,
  format: 'json',
  inCharset: 'utf-8',
  outCharset: 'utf-8',
  notice: 0,
  needNewCode: 1
}
export const options = {
  param: 'jsonpCallback'
}
export const ERR_OK = 0
然后创建recommend的api接口。ERR_OK是返回错误码的判断

import jsonp from '../common/js/jsonp'
import {commonParams, options} from './config'
export function getRecommend () {
  const url = 'https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg'
  const data = Object.assign({}, commonParams, {
    platform: 'h5',
    uin: 0,
    needNewCode: 1
  })
  return jsonp(url, data, options)
}
这里用了一下Object.assign()这个函数只进行一层的深拷贝。

三、调用

<template>
  <div class="music">
    <div v-for="item in list">
      <img :src="item.picUrl" alt="">
    </div>
  </div>
</template>
<script>
import {getRecommend} from '../../api/recommend'
import {ERR_OK} from '../../api/config'
export default {
    data(){
      return {
          list:[]
      }
    },
    created() {
        this._getData()
    },
    methods: {
        _getData() {
          getRecommend().then((res) => {
             if(res.code === ERR_OK){
                 this.list = res.data.slider
               console.log(this.list)
             }
          })
        }
    }
}
</script>
这里在created()的时候,调用方法,然后根据promise的规范,用then进行后续操作。

随机浏览