2016-12-08 1 views
0

내 코드에 모듈 식 JS 패턴을 적용하려고하지만 약속을 구현하는 데 어려움이 있습니다. 나는 "then"을 사용하여 1 라인을 약속했지만 이제는 별도의 함수를 가지고 있으며 각각이 서버를 호출하고 다른 함수에 값을 반환하면 어떻게 할 수 있는지 알 수 없습니다. 나는 사용하는 방법을 혼동 스럽습니다 & 동시에 해결했습니다. 여기 내 아래 코드입니다모듈 식 JS로 약속 사용

: 나는 기능 2에 사용되는 기능 3에서 서버에서 값을 반환하려면 어떻게

//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(); 

     } 

및 기능 2의 결과가, 다음, 기능 (1)에 사용되는 기능 1에서 html을 그릴 수 있습니다.

현재 두 번째 기능에서 오류가 발생하며 지연된 객체를 인식하지 못합니다.

다음 중첩 된 코드를 작성하려고 생각했지만 모듈 식 코드를 사용하여 코드를 구성하려고합니다. 어떤 도움을 주시면 감사하겠습니다.

+2

/A + 약속을 약속하지 않는이 JQuery와의 약속을 .fail()에 다음 마지막 .then() 체인에 의해 당신은 또한 패턴에 오류 처리를 포함 할 수 있습니다 ... 상관없이, 당신은 어떻게 jQuery를 이해하지하는 것 일을 약속합니다 ... 당신은 $ .Deferred()를 dfd에 할당하고 다음 줄은 다른 것을 할당합니다 ... 에고, 첫번째 할당은 무의미합니다 ... 다음 ... jQuery 약속 토지는 일종의 like ... then ... 약속이 해결되었다는 것을 의미합니다 ...하지만 당신은 dfd.resolve를 사용하여 다시 그것을 해결하려고합니다 ... 나는이 모든 것을 전에 말한 것 같아요, 그럼 당신은 질문을 삭제했습니다! –

+0

'$ .Deferred()'는 필요하지 않습니다. '$ .ajax()'는 jQuery 약속 객체를 반환한다. 함수 호출의 예상되는 순서는 무엇입니까? – guest271314

+0

@ JaromandaX, 귀하의 의견에 감사드립니다. 지연에 대한 내 코드에서 첫 번째 선언을 제거했습니다. 그때처럼 행동을 끝낸다는 것을 알고 있지만, done은 별도의 함수에서 성공을 지정하지만, 그 중 하나로서 성공을 제공합니다. 그러나, 내 모든 경우와 같은 여러 가지 기능을 가지고이 모든 것을 다룰 수는 없다. – Jacky

답변

0

$.ajax()은 jQuery 약속 객체를 반환하지만 $.Deferred()은 필요하지 않으며 제거 할 수 있습니다. 을 .done()으로 대체하고 원래 약속 값이 아닌 값을 반환하려면 에서 return을 사용하고 .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; 
    }) 

    }