jQuery Promise回调

卡兹1224

为了适应Firefox的限制,不得不更改我的回调语法的大部分内容之后,我遇到了一些奇怪的问题。

标记+执行代码

function List_Add() {
  SP.SOD.executeFunc('SP.js', 'SP.ClientContext', function() {
    var listTitle = 'Quote';
    var propertiesToAdd = [];
    propertiesToAdd.push({
      ID: "Q_ID",
      newval: 1,
    });
    addListItems(listTitle, propertiesToAdd)
      .done(function(items) {
        //Do Heaps of Stuff
      })
      .fail(function(error) {
        console.log(error.get_message());
      });

  });
}

和执行此功能的函数

function addListItems(listTitle, propertiesToAdd) {
  var ctx = SP.ClientContext.get_current();
  var web = ctx.get_web();
  var list = web.get_lists().getByTitle(listTitle);
  var listItemCreationInfo = new SP.ListItemCreationInformation();
  var newItem = list.addItem(listItemCreationInfo);
  propertiesToAdd.forEach(function(entry) {
    newItem.set_item(entry.ID, entry.newval);
  });
  newItem.update();
  var d = $.Deferred();
  ctx.executeQueryAsync(function() {
      d.resolve(true);
      return d.promise();
    },
    function(sender, args) {
      d.reject(args);
      return d.promise();
    });
}

通常在函数外部,返回d.promise会导致异步执行的时序问题。

运行此代码后,我收到的错误引发了标记+执行

未捕获的TypeError:无法读取未定义的属性“完成”

这些值已正确添加到列表中,因此批量工作正常,尽管未返回.done,但不允许执行后续代码。

米加尔

return d.promise();需要进入外部函数,而不是内部回调。从内部异步执行的回调返回的任何值都不会影响外部函数的返回值。

function addListItems(listTitle, propertiesToAdd) {
  // ...

  var d = $.Deferred();
  ctx.executeQueryAsync(function() {
      d.resolve(true);
    },
    function(sender, args) {
      d.reject(args);
    }
  );
  return d.promise();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章