ajax承诺被夸大了



首先我调用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。没有覆盖。

    最新更新