Асинхронная проблема Javascript (Sharepoint) - PullRequest
0 голосов
/ 18 сентября 2018

Надеюсь, кто-нибудь покажет мне способ сделать это и объяснит, почему этот код не работает.Я полагаю, что это проблема с областью видимости, но я бился об этом несколько дней.

Позвольте мне сначала объяснить, что делает код.У меня есть кнопка HTML на странице ASPX веб-части, которая выполняет функцию в файле JS.Код просматривает мой список Sharepoint для поиска элементов, в которых отсутствуют два значения поля, с помощью запроса CAML.Затем он просматривает элементы и вызывает асинхронный веб-сервис для каждого элемента.Асинхронное событие возвращает обещание, которое я использую, для обновления каждого из элементов двумя значениями, перенастроенными асинхронным событием.Каждый элемент затем сохраняется на сервере, где происходит моя проблема.Когда я отлаживаю это, Function.createDelegate (this, this.success) имеет неопределенный аргумент (b), который взрывается в b.apply ().Это определенно не моя сильная сторона в javascript.Может кто-нибудь помочь?См. Код ниже:

Примечание. См. // * Сохранение комментария в разделе Асинхронная функция для строки, вызывающей проблемы.

Функция вызова кнопок HTML

function UpdateSegmentSubsegment()
{
    //1.) Query items where segment & sub-segment blank returnin array of items *
    //2.) Loop through retuned items *
    //3.) Get employee id *
    //4.) Call Web Service and return segment & subsegment for employee id
    //5.) Update item with segment & subsegment + Save
    //6.)Loop

    //Query Information Variables
    var listname='ERD - XXXXX';
    var caml='<View Scope="Recursive"><Query><Where><And>' +
    '<IsNull><FieldRef Name="Employee_x0020_Business_x0020_Se"  /></IsNull>' + 
    '<IsNull><FieldRef Name="Employee_x0020_Business_x0020_Su"  /></IsNull>' + 
    '</And></Where></Query></View>';

    //Function Variables
    var itemcount=0;
    var context = new SP.ClientContext.get_current();

    QueryListItems(listname,caml,context).then(function(items){
        //Get item count returned from promise
        itemcount=items.get_count();
        window.status="Preparing to Process"+itemcount.toString()+" items..."

        //Prepare Looping object
        var listitemenumerator=items.getEnumerator();

        //Loop through each List Item
        while (listitemenumerator.moveNext()) {
            //Get Employee ID from list item collection
            var listitem = listitemenumerator.get_current();
            var employeeid=listitem.get_item("EmpUseAcct");

            //Check for invalid item value
            if(employeeid!="#Value!"){
                //Ansychronous Function Call
                QueryHRInformation(employeeid,listitem,context);
            }
            else
            {
                //Log CA Skip
                window.status="Skiping CA Number "+listitem.get_item("Title").toString();
            }
        };


    }); 
}

Функция запроса

//Query Promise
function QueryListItems(listname, CAMLQ,clientContext)
{
    //Defererred Object
    var deferred = new $.Deferred();

    //Sharepoint Object Model

    //Get List
    var list = clientContext.get_web().get_lists().getByTitle(listname);

    //CAML Query
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml(CAMLQ);        
    var items = list.getItems(camlQuery);

    //Get Items
    clientContext.load(items);
        clientContext.executeQueryAsync(
        Function.createDelegate(this,
            function () { deferred.resolve(items); }),
        Function.createDelegate(this,
            function (sender, args) { deferred.reject(sender, args); }));

    return deferred.promise();
}

Асинхронная функция

//Asnchronous Function Call
function QueryHRInformation(employeeid,listitem,clientContext){
    //Web Service Variables
    var curequestorID="XXXXXX";
    var wsserviceID="someweb-serviceid";
    var wsservicePassword="somepassword";
    var appIdentifier="someid";
    var wsserviceName="SomeDetails";

    //Debugging Variable to check async list item object
    var title;

    //Asynchronous Call
    XXX.ERD.BizTalk.XX.getInstance().getInfo(employeeid,curequestorID, wsserviceID, wsservicePassword, appIdentifier, wsserviceName).then(function(empResult){

            //Debugging Check
            title=listitem.get_item("Title");

            //Set list item values from web service object return (empResult)
            listitem.set_item("Employee Business Segment",empResult.BusSegment);
            listitem.set_item("Employee Business Sub Segment",empResult.SubSegment);
            //Update list item values
            listitem.update();

            //*Save Item
            clientContext.executeQueryAsync(Function.createDelegate(this, this.success), Function.createDelegate(this, this.failed));**

    }); 
}

Ответы [ 2 ]

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

Ну, я никогда не оставляю свои вопросы без ответа, поэтому другие участники сообщества разработчиков могут получить пользу от моих вопросов.Слишком много сообщений остаются без ответа или просто заканчиваются после того, как решение найдено.

Да, я подумал, что это проблема с определенными областями несколько недель назад, и решил свою проблему.Я обернул их в функции, передавая значения.Когда он отправляется в стек, он не теряет область значений из предыдущего асинхронного вызова.

Внутри первой функции, которая делает асинхронный вызов, я передаю значения и вызываю эту функцию:

SaveItem(listitem, clientContext, businesssegment,subsegment);

Вот полный код:

function UpdateSegmentSubsegment()
{
    //Prompt for Batching Note: Leave it blank to do all.
    var camlrowlimit=prompt("Please enter the batch query","");
    var camlbatch;

    //Check Batch Input
    if(camlrowlimit!=null)
    {
        //Set Dynamic RowLimit Variable 
        if(camlrowlimit=="")
        {
            camlbatch="";
        }
        else
        {
            camlbatch="<RowLimit>"+camlrowlimit+"</RowLimit>";
        }

        //Query Information Variables
        var listname='ERD - XXXXX';
        var caml='<View Scope="Recursive"><Query><Where><And>' +
        '<IsNull><FieldRef Name="Employee_x0020_Business_x0020_Se"  /></IsNull>' + 
        '<IsNull><FieldRef Name="Employee_x0020_Business_x0020_Su"  /></IsNull>' + 
        '</And></Where></Query>'+camlbatch+'</View>';

        //Function Variables
        var itemcount=0;
        var context = new SP.ClientContext.get_current();

        QueryListItems(listname,caml,context).then(function(items){
            //Get item count returned from promise
            itemcount=items.get_count();
            window.status="Preparing to Process "+itemcount.toString()+" items..."

            //Prepare Looping object
            var listitemenumerator=items.getEnumerator();

            //Loop through each List Item
            while (listitemenumerator.moveNext()) {
                //Get Employee ID from list item collection
                var listitem = listitemenumerator.get_current();
                var employeeid=listitem.get_item("EmpUseAcct");

                //Check for invalid item value
                if(employeeid!="#Value!"){
                    //Ansychronous Function Call
                    QueryHRInformation(employeeid,listitem,context);
                }
                else
                {
                    //Log CA Skip
                    console.log("Skiping CA Number "+listitem.get_item("CorrectiveActionNumber"));
                }
            };


        }); 
    }
}


//Query Promise
function QueryListItems(listname, CAMLQ,clientContext)
{
    //Defererred Object
    var deferred = new $.Deferred();

    //Sharepoint Object Model

    //Get List
    var list = clientContext.get_web().get_lists().getByTitle(listname);

    //CAML Query
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml(CAMLQ);        
    var items = list.getItems(camlQuery);

    //Get Items
    clientContext.load(items);
        clientContext.executeQueryAsync(
        Function.createDelegate(this,
            function () { deferred.resolve(items); }),
        Function.createDelegate(this,
            function (sender, args) { deferred.reject(sender, args); }));

    return deferred.promise();
}

//Asnchronous Function Call
function QueryHRInformation(employeeid,listitem,clientContext){
    //Web Service Variables
    var curequestorID="XXXXXX";
    var wsserviceID="XXXXXX";
    var wsservicePassword="XXXXXX";
    var appIdentifier="XXXXXX";
    var wsserviceName="XXXXXXX";

    //Debugging Variable to check async list item object
    //var title;

    //Asynchronous Call
    XXX.ERD.BizTalk.XX.getInstance().getInfo(employeeid,curequestorID, wsserviceID, wsservicePassword, appIdentifier, wsserviceName).then(function(empResult){

            //Empresult.status
            var businesssegment=empResult.BusSegment;
            var subsegment= empResult.SubSegment;
            SaveItem(listitem, clientContext, businesssegment,subsegment);          

            //*Save Item

            //clientContext.executeQueryAsync(Function.createDelegate(this, this.success), Function.createDelegate(this, this.failed));

    })
    .fail(function(xhr, status, msg){
                    console.log(msg);
    });                                         
}

function SaveItem(item,ctx,bsg,ssg)
{
    var refno;

    //Debugging Check
    refno=item.get_item("CorrectiveActionNumber");  
    //Set Fields
    item.set_item("Employee_x0020_Business_x0020_Se",bsg);
    item.set_item("Employee_x0020_Business_x0020_Su",ssg);
    //Update list item values
    item.update();
    //ctx.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded),Function.createDelegate(this, this.onQueryFailed));
    ctx.executeQueryAsync(Function.createDelegate(this,function(){ onQuerySucceeded(refno);}),Function.createDelegate(this, this.onQueryFailed));

}

function onQuerySucceeded(result, args) {
    console.log('Saved CA Number'+result); 
}

function onQueryFailed(sender, args) {
    console.log('Request failed. ' + args.get_message()+'\n' + args.get_stackTrace());

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

Это действительно должен быть комментарий, но поскольку у него недостаточно «репутации» ...

В любом случае, чтобы проверить, является ли это проблемой с ограничением объема, замените строку вопроса следующим:

clientContext.executeQueryAsync (function () {console.log ("Success"}, function () {console.log ("failed"})

Если это решает проблему, тогда это была проблема с определением области видимости.

Также см. Эту ссылку для правильного синтаксиса обновления элемента (т. Е. Попробуйте объявить контекст клиента и т. Д. При обновлении): https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/complete-basic-operations-using-javascript-library-code-in-sharepoint#create-update-and-delete-list-items

Наконец, я рекомендую использовать этобиблиотека: https://aymkdn.github.io/SharepointPlus/

...