Javascript 在创建新的承诺之前拒绝承诺
我正在开发一个搜索栏,当用户开始键入时,它会调用API。每按一次键,服务器就会收到一个请求并返回响应 在对服务器进行新的调用之前,我想拒绝以前的承诺,我如何才能做到这一点?现在我面临的问题是,旧的承诺又回来了,并且改变了用户界面,使其闪烁不定Javascript 在创建新的承诺之前拒绝承诺,javascript,es6-promise,Javascript,Es6 Promise,我正在开发一个搜索栏,当用户开始键入时,它会调用API。每按一次键,服务器就会收到一个请求并返回响应 在对服务器进行新的调用之前,我想拒绝以前的承诺,我如何才能做到这一点?现在我面临的问题是,旧的承诺又回来了,并且改变了用户界面,使其闪烁不定 export const makeGetPlaceData = (axios, uri) => (name, country) => { const promise = new Promise((resolve, reject) =>
export const makeGetPlaceData = (axios, uri) => (name, country) => {
const promise = new Promise((resolve, reject) => {
axios.get(`${uri}?name=${name}&country=${country}`)
.then(response => {
setTimeout(() => resolve(response), 2000);
})
.catch(error => {
console.log('rejected', error);
reject(error);
});
});
return promise;
};
使用
setTimeout
模拟缓慢的网络响应。我通常在处理程序级别而不是承诺级别执行此操作。它的要点是你记录你打了多少个电话,每个回叫都知道自己的电话号码。当承诺解决时,如果回调不再是最新的,那么尽早返回
let lastCallId = 1;
function doCall() {
var myCallId = lastCallId;
lastCallId++;
api.doSomething().then((data) => {
if (myCallId !== lastCallId) return;
// Do something with the data
});
}
您只需存储挂起的请求,然后再创建新的请求。我认为您无法强制拒绝承诺,请查看此项了解更多详细信息-@NagaSaiA,但您可以取消axios请求,这将导致输入catch子句,在该子句中,您可以调用rejectYop,
xhr
可中止。但是,promise
不是。bluebird promise库似乎有一个取消函数:,但是我认为更好的实现是在击键之间等待,或者像下面建议的@frodo2975一样进行id检查。