1

我正在尝试从一个成功的方法中检索一个参数,该方法在内部调用并使用 Javascript ECMA 脚本执行QueryAsync。

我尝试按照这里的建议

http://www.learningsharepoint.com/2013/08/07/passing-parameters-to-success-method-in-executequeryasync-sharepoint/

但我在 MicrosfotAjax.js 文件中收到以下错误:

“Collection 尚未初始化。尚未请求或未执行请求。可能需要显式请求。” 在警报中(_returnParam);命令,当它应该说“你好”时,我得到一个未定义的值。在获得返回 listItemInfo 数组的成功函数之前,我想演示一个简单的变量返回。

谢谢您的考虑

function Tblsrch(camlstr){
var siteUrl = '/sites/SIandT%20Project%20Intelligence';
var hello;
var clientContext = new SP.ClientContext(siteUrl);
var oWebsite = clientContext.get_web();
var oList = oWebsite.get_lists().getByTitle('ISATestdata');
var camlQuery = new SP.CamlQuery();

camlQuery.set_viewXml(camlstr);

    this.collListItem = oList.getItems(camlQuery);
    var _returnParam;

clientContext.executeQueryAsync(Function.createDelegate(this, function(){_returnParam = onQuerySucceeded();}), Function.createDelegate(this, this.onQueryFailed)); 

alert(_returnParam);

}

    function onQuerySucceeded(sender, args){
       var listItemInfo = new Array();
       var rowInd = 0;
        var hello;
                    var listItemEnumerator = collListItem.getEnumerator();

            while (listItemEnumerator.moveNext()) {
            var oListItem = listItemEnumerator.get_current();
           // listItemInfo += '\nType:' + oListItem.get_item('Name2') + ' | ' + oListItem.get_item('Plan') + ' | ' + oListItem.get_item('Type1');

            listItemInfo[rowInd] = new Array(10);
            listItemInfo[rowInd][0] =oListItem.get_item('Name2');
            listItemInfo[rowInd][1] =oListItem.get_item('Type1');
            listItemInfo[rowInd][2] = oListItem.get_item('Plan');
            listItemInfo[rowInd][3] = oListItem.get_item('Analyse');
            listItemInfo[rowInd][4] = oListItem.get_item('Design');
            listItemInfo[rowInd][5] = oListItem.get_item('Build');
            listItemInfo[rowInd][6] = oListItem.get_item('Test');
            listItemInfo[rowInd][7] = oListItem.get_item('Run');
            listItemInfo[rowInd][8] = oListItem.get_item('SupportMaintenance');
            listItemInfo[rowInd][9] = oListItem.get_item('Link1');
            listItemInfo[rowInd][10] = oListItem.get_item('Link2');

            rowInd++;
        }
        alert(listItemInfo[0][0] + " " + listItemInfo[0][1] + " " +listItemInfo[0][2] + " " + listItemInfo[0][3] + " " +listItemInfo[0][4] + " " );
    var _returnParam = "hello";
return _returnParam;
    }

function onQueryFailed(sender, args){
    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
4

1 回答 1

3
clientContext.executeQueryAsync(Function.createDelegate(this, function(){_returnParam = onQuerySucceeded();}), Function.createDelegate(this, this.onQueryFailed)); 

alert(_returnParam);

这是正常的。executeQueryAsync是异步的,因此被调用(= AJAX 请求已完成),然后立即调用仍然无效的 _returnParam executeQueryAsync,而无需等待 AJAX 完成。alert(_returnParam)

onQuerySucceeded如果您想要完成另一个操作,您需要在结束时调用另一个函数。

顺便说一句,我一直认为微软的方式真的很难用。如果您有兴趣,我已经创建了一个处理 Sharepoint 的库(它称为SharepointPlus)。对于您想要实现的目标,代码将是这样的(我还使用数组查看了您的代码):

$SP().list("ISATestdata", "/sites/SIandT%20Project%20Intelligence").get({fields:"Name2,Type1,Plan,Analyse,Design,Build,Test,Run,SupportMaintenance,Link1,Link2",where:"Name2 = 'Something'"}, function(data) {
  var listItemInfo = [];
  for (var i=0, len=data.length; i<len; i++) {
    listItemInfo[i] = [];
    listItemInfo[i].push(data[i].getAttribute("Name2"));
    listItemInfo[i].push(data[i].getAttribute("Type1"));
    listItemInfo[i].push(data[i].getAttribute("Plan"));
    listItemInfo[i].push(data[i].getAttribute("Analyse"));
    listItemInfo[i].push(data[i].getAttribute("Design"));
    listItemInfo[i].push(data[i].getAttribute("Build"));
    listItemInfo[i].push(data[i].getAttribute("Test"));
    listItemInfo[i].push(data[i].getAttribute("Run"));
    listItemInfo[i].push(data[i].getAttribute("SupportMaintenance"));
    listItemInfo[i].push(data[i].getAttribute("Link1"));
    listItemInfo[i].push(data[i].getAttribute("Link2"));
  }

  alert(listItemInfo[0][0] + " " + listItemInfo[0][1] + " " +listItemInfo[0][2] + " " + listItemInfo[0][3] + " " +listItemInfo[0][4] + " " );
})
于 2013-09-22T11:53:03.143 回答