javascript - 如果在给定的时间范围内多次调用相同的方法,则取消旧的 Promise.resolve
问题描述
我正在使用 Promise 和 axios 来响应调用 POST api 并获取记录列表。问题是当触发多个 API 调用时,最后得到响应的任何一个都在更新状态。我只想使用最后调用的 API 响应。Exp:使用不同的 postbody 调用 API 3 次,如果第一次调用响应花费的时间比第二次和第三次调用的时间长,那么回调是使用第一次调用 setstate 的响应,而不是我想忘记第一次调用和第二次调用,只考虑最后一次调用响应。
以下是示例通用文件
const apiService = axios.create({
baseURL: 'https://example.com/api/,
});
function post(postData) {
return Promise.resolve(apiService.post('https://example.com/api/getuserlist', postData, {
headers: {'Authorization': `Bearer sdfsdfsdf-cvdfs`}
}));
}
服务文件
static getUsers(postData) {
return post(postData);
}
反应组件
function getUsersList = (Filters )=>{
getUsers({ "Filters": Filters }).then((response) => {
this.setState({ users: response.data})
})
}
问题是当 getUsersList 被多次调用时,无论最后一个响应被设置为用户状态,最后一次调用应该是用户列表。
解决方案
const CPromise = require('c-promise2');
const axios= require('axios');
// Let's wrap axios get method to the CPromise
function get(url){
return new CPromise((resolve, reject, {onCancel})=>{
axios.get(url, {
cancelToken: new axios.CancelToken(function executor(cancel) {
onCancel(cancel)
})
}).then(resolve, reject);
});
}
let chain= null;
function makeRequest(url){
chain && chain.cancel();
chain= get(url).then((response)=> {
console.log(`Response ${JSON.stringify(response.data)}`);
}, function (err) {
console.warn(`Error: ${err}`);
}
);
}
// some endpoint with a delay of 3 seconds for a response
const url= "https://run.mocky.io/v3/753aa609-65ae-4109-8f83-9cfe365290f0?mocky-delay=3s";
makeRequest(url);
// make the same request again, abort the previous
setTimeout(()=> makeRequest(url), 1000);
但由于该包处于早期 beta 阶段,您可以使用 axios 提供的普通取消令牌参见 Axios 文档
推荐阅读
- c++ - 阻止 cin 继续接受输入
- dialogflow-es - LocationPermission 上下文中的 SSML
- linux - 创建可以导入变量并针对来自外部文本文件的变量执行代码的 bash 脚本
- angular - 覆盖离子4中的工具栏后退按钮操作
- splunk - 带有 where 子句的 Splunk 搜索查询不起作用
- excel - 如何使用 LDAP 从 excel VBA 连接到 Oracle 数据库?
- r - bookdown::html_document2 中数据框分页打印的表格标题
- angular - 更改事件未在角度 6 中触发
- laravel - 如何在 laravel Echo 中获取连接状态/其他事件
- r - ggplot2中带有阴影置信区间的平均线图