【问题标题】:How to use a promise again after it has already been resolved已解决后如何再次使用承诺
【发布时间】:2020-11-02 19:13:06
【问题描述】:

我目前正在尝试创建一个功能,允许用户添加和删除他们最喜欢的位置。最喜欢的位置存储在数据库中,我正在使用 promise 来获取和显示位置。这适用于页面加载时。但是,我希望在每次用户添加或删除最喜欢的位置后再次进行提取,因此我将显示最新的数据信息。我认为我目前遇到的问题是我正在尝试再次调用异步函数,但是因为在页面加载时承诺已经解决,因此不会发生提取。有没有办法解决这个问题?

我使用的代码如下:

var current_user = context.current_user;
var favAddressSection = document.getElementById('favouriteAddressSection');
var locations = []

const getFavAddresses = new Promise((resolve, reject) => {
  setTimeout(() =>{
    if (current_user == 0){
      resolve(null)
    }
    fetch("api/favaddress/")
      .then(response => {
          return response.json();
      })
      .then(data => {
          for (var i =0; i < data.length; i++){
            locations.push(data[i])
          }
          resolve(locations)
      })
      .catch(error => {
        reject(console.log(error))
      })
    })
  }, 1);


async function getFavAddressAwait(){

  const addresses = await getFavAddresses;
  var innerHTML = " "; 
  for (var i = 0; i < addresses.length; i++){
    innerHTML += '<div class="favAddressElement"> <h4>' + addresses[i].name + '</h4> <button class="favAddressButton"> <img src="../static/images/favAddress.png"> </button> <button onClick=deleteLocation(' + addresses[i].id + ')>Remove</button></div>'
  }
  if (addresses.length < 6){
    innerHTML += '<div class="favAddressElement"> <h5> Add Favourite </h5> <button id="addAddress" class="favAddressButton" onClick=showForm()> <img src="../static/images/add_fav.png"/> </button> </div> '
  }
  favAddressSection.innerHTML = innerHTML;
}

getFavAddressAwait();


function deleteLocation(primarykey){
  axios.delete(`http://127.0.0.1:8000/api/favaddress/destroy/${primarykey}`)
    .then(res => console.log(res))
    .then(getFavAddressAwait())
    .catch(err => console.log(err));
}

【问题讨论】:

  • 我不知道你为什么要把fetch 包装在setTimeout 中; fetch 已经返回了一个承诺。似乎这里有不必要的间接级别。

标签: javascript async-await fetch es6-promise


【解决方案1】:

您可以更改您的 getFavAddress 变量以在每次调用它时返回一个新的 Promise 实例。

另外,我建议删除您的 setTimeout,除非您有理由这样做?

像这样:

const getFavAddresses = () => new Promise((resolve, reject) => {
    if (current_user == 0){
        resolve(null);
    }
    fetch("api/favaddress/")
        .then(response => {
            return response.json();
        })
        .then(data => {
            for (var i =0; i < data.length; i++){
                locations.push(data[i]);
            }
            resolve(locations);
        })
        .catch(error => {
            reject(console.log(error));
        })
    ;
}, 1);

然后只需更新您对它的调用:await getFavAddress()

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 2018-04-02
    • 2018-10-02
    • 1970-01-01
    • 2018-03-07
    • 2016-04-05
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多