如何使用 Promise 和 setTimeout 在 JavaScript 中模拟 API 调用
const getMockData = async (data = '', error = 'unknown server error', delay) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(!!data) {
resolve({
type: 'Success ✅',
data,
});
} else {
reject({
type: 'Error ❌',
message: error,
});
}
}, delay || 1000);
});
}
// test cases
(async () => {
try {
const success = await getMockData([1,2,3]);
console.log(success.data);
} catch (err) {
console.log(err.message);
}
try {
const error = await getMockData('', '404 not found error', 3000);
console.log(error);
} catch (err) {
console.log(err.message);
}
})();
const getMockData = async (options = {
data: '',
error: 'unknown server error',
delay: null
}) => {
const {data, error, delay} = options;
return new Promise((resolve, reject) => {
setTimeout(() => {
if(!!data) {
resolve({
type: 'Success ✅',
data,
});
} else {
reject({
type: 'Error ❌',
message: error,
});
}
}, delay || 1000);
});
}
// test cases
(async () => {
try {
const success = await getMockData({data: [1,2,3]});
console.log(success.data);
} catch (err) {
console.log(err.message);
}
try {
const error = await getMockData({error: '404 not found error', delay: 3000});
console.log(error);
} catch (err) {
console.log(err.message);
}
})();
refs
https://stackoverflow.com/questions/50739771/how-do-i-mock-a-promise-in-reactjs
https://gist.github.com/jofftiquez/c647654e76271119ea714805cfdb5ca2
https://michael-panik.com/blog/javascript-quick-tip-simulated-api-calls-with-promises/
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/async_function
https://stackoverflow.com/questions/40745153/es8-immediately-invoked-async-function-expression