2014-01-14 75 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