编辑代码

function JSONP({ url, params, callbackName }) {
    const generateUrl = () => {
        let str = '';
        for (let key in params) {
            str += `${key}=${params[key]}&`;
        }
        str += `callback=${callbackName}`;
        return `${url}?${str}`;
    }

    return new Promise((resolve, reject) => {
        const scriptElm = document.createElement('script');
        scriptElm.async = true;
        scriptElm.src = generateUrl();
        scriptElm.type = "text/javascript";

        scriptElm.onerror = error => {
            reject(error);
        }

        window[callbackName] = data => {
            resolve(data);
            document.body.removeChild(scriptElm);
            delete window[callbackName];
        }

        document.body.appendChild(scriptElm);
    });
}


// 测试用例1:获取天气数据
const params1 = {
  city: 'New York',
  apiKey: 'your-api-key'
};
const callbackName1 = 'handleWeatherResponse';

JSONP({
  url: 'https://api.weather.com',
  params: params1,
  callbackName: callbackName1
}).then(data => {
  console.log(data);
}).catch(error => {
  console.error('Error:', error);
});

// 测试用例2:获取用户信息
const params2 = {
  userId: '123456',
  apiKey: 'your-api-key'
};
const callbackName2 = 'handleUserInfoResponse';

JSONP({
  url: 'https://api.example.com',
  params: params2,
  callbackName: callbackName2
}).then(data => {
  console.log(data);
}).catch(error => {
  console.error('Error:', error);
});