jQuery递归Ajax调用

时间:2018-10-15 16:48:05

标签: jquery asynchronous sharepoint

谁能弄清楚如何将其转换为使用诺言。我尝试了几件事,似乎没有用。我从在SharePoint页上运行的某人继承了此代码。问题的一部分是Async:false设置。而且,当我尝试将其设置为true时,功能区工具栏上的所有东西都损坏了,不幸的是,我无权访问功能区代码。

function findChildren(item, ctxT) {
    item.children = [];
    return jQuery.ajax({
        url: String.format("{0}/_api/web/lists(guid'{1}')/items?$filter=TrackingUnderNumber eq '{2}'", ctxT.HttpRoot, SP.Guid._normalizeGuidString$p(ctxT.listName), item.TrackingNumber),
        async: false,
        method: "GET",
        headers: { "accept": "application/json;odata=verbose" },
        success: function (data) {
            data.d.results.forEach(function (dItem) {
                dItem.parent = item;
                item.children.push(dItem);
                findChildren(dItem, ctxT);
            });
        }
    });
}

我认为他选择使用Async false的部分原因是他想等到整个树加载完毕后再启用功能区上的按钮和功能。但是必须有一种更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

很难看到其余的代码,但这可能会起作用:

function getAllChildren(item, ctxT) {
    return new Promise((resolve, reject) => {
        const getItemsChildren = () => {
            item.children = [];
            jQuery.ajax({
                url: String.format("{0}/_api/web/lists(guid'{1}')/items?$filter=TrackingUnderNumber eq '{2}'", ctxT.HttpRoot, SP.Guid._normalizeGuidString$p(ctxT.listName), item.TrackingNumber),
                async: false,
                method: "GET",
                headers: { "accept": "application/json;odata=verbose" },
                success: function (data) {
                    if (data.d.results.length > 0){
                        data.d.results.forEach(function (dItem) {
                            dItem.parent = item;
                            item.children.push(dItem);
                            getItemsChildren(dItem, ctxT);
                        });
                    } else {
                        resolve(); 
                    }

                },
                error: (err) => { reject(err); } 
            });
        }; 
        getItemsChildren(); 
    });
}

// then you can do 
getAllChildren(item, ctxt).then(() => { /* do something now */ });

// or inside an async function 
(async () => {
    await getAllChildren(item, ctxt); 
    // do something now
})

要做出自己的承诺,请执行以下操作:

  1. 定义您的功能
  2. 立即返回new Promise((resolve, reject) => {...});
  3. 在该承诺内,执行需要做的事情(进行API调用等);
  4. 当您希望结束承诺时,只需调用'resolve(); or reject()`;
  5. 传递给resolvereject的数据将成为您在.then中获得的数据

因此,如果我打电话给resolve('Promises rock!'),然后再这样做.then((data) => { console.log(data); }),那么我会期望看到“ Promise rock!”作为我的控制台日志。

祝你好运!