首先我调用getLiveData,它从服务器获取数据然后呈现ui的某些部分,这些部分调用Id为的bindLiveData
有时数据会晚于UI的某些部分,这就是我等待请求完成的原因。当出现异常时,问题会变得棘手,因为方法会再次调用自己(实际调用次数多达几次(
我将不再有来自UI的调用,因为它们在渲染后调用bindLiveData一次所以在失败的方法中,我可以获取所有的Id,在下一个成功的ajax请求中,我就可以对数据进行分类。
但是我的infoDataPromise会发生什么呢??因为它将被错误覆盖
上一个需求的所有"失败"都会触发吗?如何避免这个承诺被推翻?
var infoDataPromise;
var mydata;
function getLiveData() {
infoDataPromise = $.ajax({
type: "POST",
dataType: 'JSON',
contentType: 'application/json',
url: "someUrl",
success: function (data) {mydata = data; },
error: function () {
getLiveData();
}
});
}
function bindLiveData(Id) {
infoDataPromise.done(() => {
if (mydata) {
var item = mydata.find(x => x.Id === Id);
adjustUIForId(item);
}
}).fail(() => {
mydata = null;
});
}
async/await
语法使promise更易于管理const getLiveData = async () => {
const config = {
type: "POST",
dataType: 'JSON',
contentType: 'application/json',
url: "someUrl"
};
try {
return await $.ajax(config);
} catch (e) {
console.log(e);
return getLiveData();
}
}
const handleData = async () => {
const data = await getLiveData();
if (!data) return;
const item = data.find(x => x.Id === Id);
adjustUIForId(item);
};
handleData();
现在,getLiveData
返回一个单独的promise,当有一个成功的请求时,它会解析,您不需要担心任何其他promise。没有覆盖。