$.Deferred() and SharePoint 2013 JavaScript CSOM

$.Deferred() and SharePoint 2013 JavaScript CSOM

本文关键字:2013 JavaScript CSOM SharePoint and Deferred      更新时间:2023-09-26

我想利用jQuery $。Deferred/promise 功能以及 SharePoint JavaScript API。这是我试图实现的目标的一个例子。

function getCachedSearches() {
    var dfd = $.Deferred(function () {
        var list = context
                .get_web()
                .get_lists()
                .getByTitle('CachedSearches');
        cached_searches = list.getItems('');
        context.load(cached_searches);
        context.executeQueryAsync(
           function () {
               dfd.resolve();
           },
           function (sender, args) {
               dfd.reject(args.get_message());
           }
        );
    });
    return dfd.promise();
}
function addCachedSearch(phrase) {
    var dfd = $.Deferred(function () {
        var list = context
                .get_web()
                .get_lists()
                .getByTitle('CachedSearches');
        var create_item = new SP.ListItemCreationInformation();
        var list_item = list.addItem(create_item);
        list_item.set_item('Title', phrase);
        list_item.update();
        context.load(list_item);
        context.executeQueryAsync(
           function () {
               dfd.resolve();
           },
           function (sender, args) {
               dfd.reject(args.get_message());
           }
        );
    });
    return dfd.promise();
}
function doSearch() {
    addCachedSearch($('#phrase').val())
        .then(getCachedSearches());
}

不幸的是,上面的代码没有按预期工作 - 第二次调用在执行之前不会等待第一个承诺被解析。非常感谢

我想我看到了一个问题:.then()需要一个函数引用,但你正在调用函数并传入结果(在本例中为承诺)。试试这个:

function doSearch() {
    addCachedSearch($('#phrase').val())
        .then(getCachedSearches);
}

请注意,getCachedSearches不再具有()参数。

只是为了踢球,这里有一个jsFiddle,上面有一个提炼的例子,说明你似乎正在尝试做什么:http://jsfiddle.net/UbBz3/