Javascript 在创建新的承诺之前拒绝承诺

Javascript 在创建新的承诺之前拒绝承诺,javascript,es6-promise,Javascript,Es6 Promise,我正在开发一个搜索栏,当用户开始键入时,它会调用API。每按一次键,服务器就会收到一个请求并返回响应 在对服务器进行新的调用之前,我想拒绝以前的承诺,我如何才能做到这一点?现在我面临的问题是,旧的承诺又回来了,并且改变了用户界面,使其闪烁不定 export const makeGetPlaceData = (axios, uri) => (name, country) => { const promise = new Promise((resolve, reject) =>

我正在开发一个搜索栏,当用户开始键入时,它会调用API。每按一次键,服务器就会收到一个请求并返回响应

在对服务器进行新的调用之前,我想拒绝以前的承诺,我如何才能做到这一点?现在我面临的问题是,旧的承诺又回来了,并且改变了用户界面,使其闪烁不定

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检查。