2016-12-08 3 views
0

Я пытаюсь применить модульный шаблон JS в своем коде, но мне трудно выполнять обещания. Я привык к обещаниям в 1 строке, используя «then», но теперь у меня есть отдельные функции, и каждый из них вызывает сервер и возвращает значение другой функции, я не знаю, как это сделать. Я смущен, как я могу использовать сделано & решить в то же время.Использование обещаний с модульным JS

Вот мой код ниже:

//I want to call a function, makeLinksObject(), which will call the another function that calls the server 
    var formattedObject = makeLinksObject(); 
    formattedObject.done(function (renderedObject) { 
      render(renderObject); 
        }) 

    function makeLinksObject() { 
      //here I want to call another function that will call the server 
      var dfd = getLastTimeUpdated(); 
      var linksArray = []; 
      var linksObject = {}; 
      //get site updated date 
      dfd.done(function (dateUpdated) { 
       $.each(links, function (index, value) { 
        var linkObject = {}; 
        obj.Title = value.Title.toLowerCase(); 
        linksArray.push(obj); 
       }); 

       linksObject = { 
        lblcallerId: "some value here" 
        links: linksArray 
       } 

      }); // end done 

      return dfd.resolve(linksObject); 
     } 
     function getLastTimeUpdated() { 
      var modificationUrl = "serverurl" 
      dfd = $.ajax({ 
       url: modificationUrl, 
       method: "GET", 
       headers: { 
        "accept": "application/json;odata=verbose" 
       } 
      }); 
      dfd.done(function(data){ 
       dfd.resolve(data.d.LastItemModified); 
      }) 

       return dfd.promise(); 

     } 

Как вернуть значение из сервера от функции 3, для использования в функции 2, а результат функции 2, для использования в функции 1, то Я могу нарисовать свой html в функции 1.

В настоящее время у меня есть ошибка во второй функции, и она не распознает мой отложенный объект.

Я думал о написании кода, который тогда был бы вложен, но я хочу использовать модульный код, чтобы сделать мой код организованным. Любая помощь будет оценена по достоинству.

+2

эти JQuery обещания, которые не обещают обещания/A + ... независимо, вы, кажется, не понимают, как JQuery обещания работают ... вы назначаете $ .Deferred() в dfd, затем следующую строку, вы назначаете что-то еще ... ergo, первое назначение бессмысленно ... далее ... .done в jQuery Обещающая земля - ​​это своего рода например ... то есть, что обещание было разрешено ... но вы пытаетесь разрешить его снова, используя dfd.resolve .. Я думаю, что я сказал все это раньше, а затем вы удалили вопрос! –

+0

'$ .Deferred()' не требуется. '$ .ajax()' возвращает объект обещания jQuery. Каков ожидаемый порядок вызовов функций? – guest271314

+0

@JaromandaX, спасибо за ваш комментарий. Я удалил первое объявление из моего кода для отложенного. Я знаю, что это действие действует тогда, но сделано, указывает успех на отдельной функции, но затем дает успех как один из его аргументов. Тем не менее, я не могу обойти все это с помощью нескольких функций, таких как мой случай – Jacky

ответ

0

$.ajax() возвращает объект обещания jQuery, $.Deferred() не является необходимым и может быть удален; замените .then() на номер .done(), где вы хотите вернуть значение, отличное от исходного значения обещания, возвращенного с $.ajax(), используйте return в функциональных вызовах и .then(). Обратите внимание, что вы могли бы также включать в себя обработку с шаблоном ошибки, приковав .fail() к тогда последней .then() в каждой цепи

var formattedObject = makeLinksObject(); 

    formattedObject 
    .done(function(renderedObject) { 
    render(renderObject); 
    }) 

    function makeLinksObject() { 
    var dfd = getLastTimeUpdated(); 
    var linksArray = []; 
    var linksObject = {}; 

    return dfd.then(function(dateUpdated) { 
     $.each(links, function(index, value) { 
     var linkObject = {}; 
     obj.Title = value.Title.toLowerCase(); 
     linksArray.push(obj); 
     }); 

     linksObject = { 
     lblcallerId: "some value here", 
     links: linksArray 
     } 

    }) 
    .then(function() { 
     return linksObject 
    }); 
    } 

    function getLastTimeUpdated() { 
    var modificationUrl = "serverurl" 
    return $.ajax({ 
     url: modificationUrl, 
     method: "GET", 
     headers: { 
     "accept": "application/json;odata=verbose" 
     } 
    }) 
    .then(function(data) { 
     return data.d.LastItemModified; 
    }) 

    } 
Смежные вопросы