2014-01-14 5 views
1

Я написал сценарий, который обновляет поле в списке SharePoint, которое работает, но когда я удаляю предупреждение («test»); линия перестает работать. Вот мой код:JavaScript работает с предупреждением, не работает без

<script type="text/javascript"> 

$(document).ready(function() { ExecuteOrDelayUntilScriptLoaded(loadConstants, "sp.js"); });   

function loadConstants() { 

    var userid= _spPageContextInfo.userId; 
    var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + userid + ")"; 
    var requestHeaders = { "accept" : "application/json;odata=verbose" }; 
    $.ajax({ 
     url : requestUri, 
     contentType : "application/json;odata=verbose", 
     headers : requestHeaders, 
     success : onSuccess, 
     error : onError 
    }); 

    function onSuccess(data, request){ 
     var loginName = data.d.Title; 

     var ctx = new SP.ClientContext("site name"); 
     var oList = ctx.get_web().get_lists().getByTitle('list name'); 
     this.oListItem = oList.getItemById(1);   

     ctx.load(this.oListItem); 
     ctx.executeQueryAsync(Function.createDelegate(this, function() {             
                this.oListItem.set_item('Read', loginName + ' ' + getTodayDate();); 
                }), function (sender, args) { alert('Error occured' + args.get_message());});  

     //HERE IS THE ALERT: 
     //alert("test"); 
     this.oListItem.update();    

     ctx.executeQueryAsync(
      Function.createDelegate(this, this.onQuerySucceeded), 
      Function.createDelegate(this, this.onQueryFailed) 
     ); 
    } 
    function onError(error) { 
     alert("error"); 
    } 
    function getTodayDate() { 
     //code that gets today's date 
     return today; 
    } 
} 

</script> 

Заранее благодарю вас за помощь в решении этой проблемы!

+0

Это ключевая часть 'executeQueryAsync()' is 'Async'. '.update()' должен быть в функции обратного вызова, которую вы передаете. Вот почему есть обратный вызов. ;-) –

+0

... Любой код, который полагается на ответ от 'executeQueryAsync()', должен быть вызван из функции обратного вызова, которую вы передаете. 'Alert()' заставляет его работать, потому что он блокирует '.update()' достаточно долго для ответа на возврат. –

+0

У меня нет большого опыта работы с JavaScript, можете ли вы объяснить мне, как я это делаю? Спасибо! – Kate

ответ

1

Я не знаю этого API, но похоже, что вы передаете два обратных вызова до executeQueryAsync().

Первый, фактически, сначала передан Function.createDelegate(). Я предполагаю, что возвращает новую функцию. В любом случае, анонимная функция, которую вы передаете, кажется, используется для ответа на запрос. Поэтому любой код, который полагается на возвращенные данные, должен быть размещен там $ (document) .ready (function() {ExecuteOrDelayUntilScriptLoaded (loadConstants, "sp.js");});

function loadConstants() { 

    var userid= _spPageContextInfo.userId; 
    var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + userid + ")"; 
    var requestHeaders = { "accept" : "application/json;odata=verbose" }; 
    $.ajax({ 
     url : requestUri, 
     contentType : "application/json;odata=verbose", 
     headers : requestHeaders, 
     success : onSuccess, 
     error : onError 
    }); 

    function onSuccess(data, request){ 
     var loginName = data.d.Title; 

     var ctx = new SP.ClientContext("site name"); 
     var oList = ctx.get_web().get_lists().getByTitle('list name'); 
     this.oListItem = oList.getItemById(1);   

     ctx.load(this.oListItem); 
     ctx.executeQueryAsync(Function.createDelegate(this, function() {             
            this.oListItem.set_item('Read', loginName + ' ' + getTodayDate(); 

// run after the executeQueryAsync response arrives---vvvvvv 
            this.oListItem.update();    

            ctx.executeQueryAsync(
            Function.createDelegate(this, this.onQuerySucceeded), 
            Function.createDelegate(this, this.onQueryFailed) 
           ); 
           }), 
           function (sender, args) { 
            alert('Error occured' + args.get_message()); 
           });  
    } 
    function onError(error) { 
     alert("error"); 
    } 
    function getTodayDate() { 
     //code that gets today's date 
     return today; 
    } 
} 

Так что теперь ваш .update() код не будет вызываться до этого обратного вызова срабатывает в ответ на запрос не возвращается.

+0

Да, я попытался переместить его внутри, но он не сработал ... Он работает только тогда, когда .update находится снаружи, и перед ним появляется предупреждение. – Kate

+0

@Ekaterina: Если вы положили 'alert (" test ")' в обратный вызов (вверху), вы видите предупреждение? –

+0

Да, я вижу предупреждение, но элемент не обновляется. – Kate

Смежные вопросы