jQuery Promise Callback

jQuery Promise Callback

本文关键字:Callback Promise jQuery      更新时间:2023-09-26

在不得不更改我的回调语法以适应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 虽然通常在函数之外,但会导致异步执行的计时问题。

运行此代码后收到的错误被抛出标记+执行

捕获的类型错误:无法读取未定义的属性"完成">

这些值正确地添加到列表中,因此批量工作,.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();
}