在模块化 JS 中使用 promises

Using promises with modular JS

我正在尝试在我的代码中应用模块化 JS 模式,但我很难实现承诺。我习惯于使用 "then" 在 1 行中承诺,但现在我有单独的函数,每个函数都在调用服务器并 returning 一个值给另一个函数,我不知道我是怎么做到的可以做到这一点。我很困惑如何同时使用完成和解决。

下面是我的代码:

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

        }

如何 return 函数 3 的服务器值用于函数 2,以及函数 2 的结果用于函数 1,然后我可以绘制我的 html 在函数 1.

目前,我在第二个函数中遇到错误,它无法识别我的延迟对象。

那时我想过写代码会嵌套,然后,但我想使用模块化代码来使我的代码井井有条。任何帮助,将不胜感激。

$.ajax() return是一个jQuery promise对象,$.Deferred()不是必须的,可以去掉;将 .then() 替换为 .done(),其中您想 return 一个不同于 $.ajax() 的原始承诺值 return 的值,在函数中使用 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;
     })

   }