如何使url api选项短?



在本例中,我创建了一个递归承诺函数,用于调用不同的api url。如何使这段代码中的切换选项不太长?

let listUrl: Array<string> = ['URL-1', 'URL-2', 'URL-3', 'URL-n']
const rpcCall = async (baseURL: string) => {
switch (baseURL) {
case 'URL-1':
return new Promise((_resolve, reject) => fetch(baseURL)
.then(resolve => resolve.status !== 200 || 201 ? Promise.reject() : resolve)
.catch(reject)
);
case 'URL-2':
return new Promise((_resolve, reject) => fetch(baseURL)
.then(resolve => resolve.status !== 200 || 201 ? Promise.reject() : resolve)
.catch(reject)
);
case 'URL-3':
return new Promise((_resolve, reject) => fetch(baseURL)
.then(resolve => resolve.status !== 200 || 201 ? Promise.reject() : resolve)
.catch(reject)
);
case 'URL-n':
return new Promise((_resolve, reject) => fetch(baseURL)
.then(resolve => resolve.status !== 200 || 201 ? Promise.reject() : resolve)
.catch(reject)
);
default:
return Promise.reject();
}
}
const checkToken = async (index = 0): Promise<string> => {
new Promise((res, rej) =>
rpcCall(listUrl[index])
.then(res)
.catch((reject) => {
if (index < baseUrl.length && reject) {
return checkToken(index + 1)
.then(res)
.catch(rej);
} else {
rej();
}
})
);
return listUrl[index]
}

我指的是选项

的最佳实践方法

您的url用例都是相同的,因此它们可以组合在一起。您还应该避免显式的Promise构造反模式。200 || 201也不会正确地比较这两个值。解析器函数也与fetch中的Response对象不同——最好恰当地命名参数。

你不需要在checkToken构建另一个承诺-这个函数也看起来坏了,因为它正在创建一个不被使用的承诺。另一个问题是Response对象不是字符串;: Promise<string>不是一个准确的类型。也许您打算使用response.text()

之类的内容
let listUrl: Array<string> = ['URL-1', 'URL-2', 'URL-3', 'URL-n']
const rpcCall = (baseURL: string) => {
const urls = ['URL-1', 'URL-2', 'URL-3', 'URL-n'];
if (!urls.includes(baseURL)) {
return Promise.reject();
}
return fetch(baseURL)
.then(response => {
if (response.status !== 200 && response.status !== 201) {
throw new Error();
}
return response.text();
});
};
const checkToken = async (index = 0): Promise<string> => {
return rpcCall(listUrl[index])
.catch((error) => {
if (index < listUrl.length && error) {
return checkToken(index + 1)
} else {
throw new Error(error);
}
});
};

由于这是TypeScript,你也可以考虑修改rpcCall,要求传递的字符串是允许的url之一,从而迫使调用者首先验证潜在的参数。

const urls = ['URL-1', 'URL-2', 'URL-3', 'URL-n'];
const rpcCall = (baseURL: typeof urls[number]) => {
return fetch(baseURL)
// etc

最新更新