如何在已经解决后再次使用承诺
How to use a promise again after it has already been resolved
我目前正在尝试创建一项功能,允许用户添加和删除他们最喜欢的位置。最喜欢的位置存储在数据库中,我正在使用承诺来获取和显示位置。这适用于页面加载时。但是,我希望在每次用户添加或删除喜爱的位置后再次进行提取,因此我将显示最新的数据信息。我认为我目前遇到的问题是我正在尝试再次调用异步函数,但是因为在页面加载时承诺已经解决,所以没有进行提取。有办法解决这个问题吗?
我使用的代码如下所示:
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));
}
您可以将 getFavAddress
变量更改为 return 一个新的承诺实例,每次调用它时。
此外,我建议删除您的 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()
我目前正在尝试创建一项功能,允许用户添加和删除他们最喜欢的位置。最喜欢的位置存储在数据库中,我正在使用承诺来获取和显示位置。这适用于页面加载时。但是,我希望在每次用户添加或删除喜爱的位置后再次进行提取,因此我将显示最新的数据信息。我认为我目前遇到的问题是我正在尝试再次调用异步函数,但是因为在页面加载时承诺已经解决,所以没有进行提取。有办法解决这个问题吗?
我使用的代码如下所示:
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));
}
您可以将 getFavAddress
变量更改为 return 一个新的承诺实例,每次调用它时。
此外,我建议删除您的 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()