返回.executeQueryAsync中的变量

时间:2017-03-30 12:23:28

标签: javascript jquery sharepoint

我有这个代码可以提醒我想要的信息,但我不知道如何修改它以显示我的选择列表,我只需要知道如何更改此代码并将alert(listItemInfo);替换为return listItemInfo;显示我的自定义列表,而不是默认的SharePoint列表

var lookupSample = lookupSample || {};
var siteUrl = '/sites/studentday/bat/testJS';

lookupSample.CustomizeFieldRendering = function() {
  // Intialize the variables for overrides objects
  var overrideCtx = {
    Templates: {
      Fields: {
        'Supplier': {
          'NewForm': ExecuteOrDelayUntilScriptLoaded(lookupSample.singleLookupValue, "sp.js")
        }
      }
    }
  };
  // Register the override of the field
  SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideCtx);
}

lookupSample.singleLookupValue = function(ctx) {
  var clientContext = new SP.ClientContext(siteUrl);
  var oList = clientContext.get_web().get_lists().getByTitle('Suppliers');
  var camlQuery = new SP.CamlQuery();
  camlQuery.set_viewXml('<View><Query><GroupBy><FieldRef Name = "Category"/></GroupBy><OrderBy><FieldRef Name = "Title"/></OrderBy></Query></View>');
  this.collListItem = oList.getItems(camlQuery);
  clientContext.load(collListItem);
  clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}

function onQuerySucceeded(sender, args) {
  var listItemInfo = [];
  var listItemEnumerator = collListItem.getEnumerator();
  var tempo = '';
  listItemInfo.push('<select id="DdList" style="width: 200px;">');
  while (listItemEnumerator.moveNext()) {
    var oListItem = listItemEnumerator.get_current();
    if (tempo == oListItem.get_item('Category')) {
      listItemInfo.push('\n    <option value ="' + oListItem.get_id() + '">' + oListItem.get_item('Title') + '</option>');
    } else {
      if (tempo != "") {
        listItemInfo.push('\n  </optgroup>');
      }
      listItemInfo.push('\n  <optgroup label ="' + oListItem.get_item('Category') + '">');
      listItemInfo.push('\n    <option value ="' + oListItem.get_id() + '">' + oListItem.get_item('Title') + '</option>');
      tempo = oListItem.get_item('Category');
    }
  }
  listItemInfo.push('\n  </optgroup>');
  listItemInfo.push('\n</select>');
  alert(listItemInfo);
}

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

lookupSample.CustomizeFieldRendering();

1 个答案:

答案 0 :(得分:0)

您无法直接从异步函数返回值。

不是在异步函数的末尾返回一个值,而是编写一个新函数来执行你要对该返回值执行的任何操作,并调用该函数。

例如,而不是:

var asyncResult = asyncDoSomething();
doSomethingWithResult(asyncResult); // WRONG

function asyncDoSomething(){
    var something;
    // logic here
    return something;
}

...遵循这种模式:

asyncDoSomething();
// no more code should be executed in this context after calling async function

function asyncDoSomething(){
    var something;
    // logic here
    doSomethingWithResult(something); // RIGHT: logic moved forward
}

在调用异步函数之后,不要在同一范围内添加额外的代码行。

相反,将该逻辑向前传递,这可能意味着将其嵌入到异步函数中,或者(更常见地)将回调函数传递给异步函数,以便在完成任何操作时调用它。

现代库通常通过让异步函数接受两个参数来解决这种模式,这两个参数指示在完成时调用哪些函数。例如,executeQueryAsync有两个参数:成功时执行的函数和失败时执行的函数。

JavaScript“promises”的工作方式类似,每个promise对象允许您指定在返回promise时调用的函数(通过then()函数定义)。