2014-01-14 74 views
1

我寫了一個腳本,更新SharePoint列表中的一個字段的工作,但當我刪除警報(「測試」);線停止工作。這裏是我的代碼: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()'的關鍵部分是'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