Jquery рекурсивный Ajax Call - PullRequest
       3

Jquery рекурсивный Ajax Call

0 голосов
/ 15 октября 2018

Может кто-нибудь выяснить, как преобразовать это в использование обещаний.Я пробовал несколько вещей, но это, похоже, не работает.Я унаследовал этот код от кого-то, кто запускает его на странице SharePoint.Частично проблема заключается в настройке Async: false.И когда я попытался установить его в истинное положение, на панели инструментов на ленте все ломалось, к сожалению, у меня нет доступа к коду ленты.

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 голосов
/ 15 октября 2018

Сложно не увидеть остальную часть кода, но это может сработать:

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. Если вы хотите, чтобы обещание закончилось, просто вызовите 'resol (); or reject () `;
  5. Данные, переданные resolve и reject, будут данными, которые вы получите в .then

Так что, если я позвоню resolve('Promises rock!'), а затем сделаю это .then((data) => { console.log(data); }), тогда я ожидаю увидеть "Обещания рок!"как мой консольный журнал.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...