2016-02-16 5 views
0

После того, как мне пришлось изменить бит синтаксиса обратного вызова, чтобы учесть ограничения Firefox, я сталкиваюсь с некоторыми странными проблемами.jQuery Promise Callback

Markup + Выполнение кода

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 в то время как обычно вне функций не вызывает проблемы синхронизации с выполнением асинхронной.

Ошибка я получаю после выполнения этого кода генерируется на отметку до + выполнение

Uncaught TypeError: Не удается прочитать свойство «сделано» неопределенных

Значения добавления в списки правильно, так основная часть работает, .done не возвращается, хотя, следовательно, не позволяет выполнять последующий код.

+0

'addListItems' ничего не возвращает. –

+0

Вы вызываете 'addListItems (listTitle, propertiesToAdd) .done(). Fail()' и эта функция ничего не возвращает – DelightedD0D

ответ

1

Ваш 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(); 
}