#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть функция, которая вызывает один API:
const response = fetch(APIfunctonName, {
method: "POST",
body: JSON.stringify(searchRequest),
headers: {
"Content-type": "application/json; charset=UTF-8",
},
})
.then((res) => res.json())
.then(
(result) => {
let urlParams = this.getRequests();
let reqid = urlParams["requested"];
var newUrl = window.location.href
.replace(`requestID=${reqid}`, "requestID=0")
.replace("requestID=0", "requestID=" result.RequestId); //result.RequestId always have proper one
history.pushState({}, null, newUrl);
this.getList(result.RequestId); //sometimes this goes as undefined
},
(error) => {
console.log(error);
}
);
Я всегда получаю соответствующий запрос в результирующем объекте, но я не понимаю, почему иногда я получаю старый идентификатор в функции getList
Комментарии:
1. Я считаю, что это зависит от вашей конечной точки api (
APIfunctionName
). Как мы можем помочь, если мы не знаем, как работает эта конечная точка?
Ответ №1:
Вы могли бы использовать обещание следующим образом, чтобы убедиться, что правильный запрос будет передан следующей инструкции :
let p = new Promise((resolve , reject) => {
let urlParams = this.getRequests();
let reqid = urlParams["requested"];
var newUrl = window.location.href
.replace(`requestID=${reqid}`, "requestID=0")
.replace("requestID=0", "requestID=" result.RequestId);
history.pushState({}, null, newUrl);
resolve(result);
});
p.then((result) => {
this.getList(result.RequestId);
});
Ответ №2:
я думаю, что причиной является разница между синхронизацией ajax и асинхронным ajax.
если это ниже, ajax this.getRequests()
является асинхронным. Ваш код получит некоторую случайную ошибку.
let urlParams = this.getRequests();
- Первое решение — изменить async на sync.
Вы можете изменить это this.getRequests()
на синхронизацию. Ваш код будет работать просто отлично.
- Второе решение — использовать
await
иasync
.
const response = fetch(APIfunctonName, {
method: "POST",
body: JSON.stringify(searchRequest),
headers: {
"Content-type": "application/json; charset=UTF-8",
},
})
.then((res) => res.json())
.then(
async (result) => {
let urlParams = await this.getRequests();
let reqid = urlParams["requested"];
var newUrl = window.location.href
.replace(`requestID=${reqid}`, "requestID=0")
.replace("requestID=0", "requestID=" result.RequestId); //result.RequestId always have proper one
history.pushState({}, null, newUrl);
this.getList(result.RequestId); //sometimes this goes as undefined
},
(error) => {
console.log(error);
}
);
Комментарии:
1. Поскольку проблема, по-видимому, связана с
result
object и неurlParams
возвращается getRequests, я не думаю, что это основная проблема. Даже еслиthis.getRequests();
это асинхронно, это не окажет никакого влияния на то, что содержится внутриresult
объекта