在函数

时间:2017-09-08 14:30:12

标签: javascript angularjs asynchronous promise angular-http

我对承诺的回归存在一些问题。之前,在http调用期间,我使用了这样一个返回一个promise的函数:

get_data: function (url)
{
     let timestamp = new Date();
     return $http({
         method: "GET",
         url: url
         headers: {
              'timestamp': timestamp,
         }
     }).then(
            function successCallback(response)
            {

                console.dir("Response:");
                console.dir(response["data"]);

                return (response["data"])
            },
            function errorCallback(response)
            {
                console.dir(response);
                return response;
            });
    },

这是非常直接的,我可以像这样使用它:

get_data('my_awesome_url').then(function(response){
    let my_awesome_data = response
})

罪魁祸首是时间戳。我用它来进行一些认证,其原因并不重要,但是从客户端那里得到它我常常是另一个语言中的恶意或系统本地设置的受害者。

我的解决方案是创建一个请求服务器时间戳的函数。但通过这样做,我必须先等待时间戳请求,然后启动另一个请求......等待它结束。 这是我不知道该怎么做的地方。我的代码看起来像这样:

get_data: function (url)
{
     let timestamp = new Date();
     get_timestamp().then(function(){
         return $http({
             method: "GET",
             url: url
             headers: {
                  'timestamp': timestamp,
             }
         }).then(
                function successCallback(response)
                {

                    console.dir("Response:");
                    console.dir(response["data"]);

                    return (response["data"])
                },
                function errorCallback(response)
                {
                    console.dir(response);
                    return response;
                });
        });
    },

但我不确定应该归还什么。我是否应该返回get_timestamp承诺并在"然后"等待其他请求结束?我应该将get_timestamp作为同步调用,因为它毕竟只是一个小日期字符串吗? 我在我的代码中一直使用旧函数,所以只保留旧的使用方法(只有一个)会很棒。

一如既往地感谢所有人。

2 个答案:

答案 0 :(得分:1)

你会这样写:

get_data: function(url) {
  return get_timestamp() // request the timestamp this returns a promise
    .then(function(timestamp) {   // on which then is called wich itself returns a promise.
                         // the callback of this then is called as soon 
                         // as the promise returned by timestamp
                         // is resolved
      return $http({
        method: "GET",
        url: url
        headers: {
          'timestamp': timestamp,
        }
      }) // here you return the Promise that is created by the $http
    })
    .then(function(response) { // the callback of this then is called as soon
                               // as the previous promise was resolved

      console.dir("Response:");
      console.dir(response["data"]);

      return (response["data"])
    })
    .catch(function(response) {
      console.dir(response);
      return response;
    });
},

首先我会用:

.then(function(response) {
  console.dir("Response:");
  console.dir(response["data"]);

  return (response["data"])
})
.catch(function(response) {
  console.dir(response);
  return response;
});

而不是

.then(
  function successCallback(response) {

    console.dir("Response:");
    console.dir(response["data"]);

    return (response["data"])
  },
  function errorCallback(response) {
    console.dir(response);
    return response;
  });
})

因为如果您有更长的链条,以后会更容易阅读。

return返回通过链创建的最后一个Promise,即调用返回的Prom .catch(function(response) {...}

答案 1 :(得分:1)

你应该链接Promises并返回链的结果:

function get_data(url) {
  return get_timestamp()
    .then((timestamp) => {
      return $http({
         method: "GET",
         url: url,
         headers: {
           timestamp: timestamp
         }
      });
    })
    .then((response) => {
      console.dir("Response:");
      console.dir(response["data"]);

      return response["data"];
    })
    .catch((response) => {
      console.dir(response);
      return response;
    });
}

请注意,我们在链的末尾只需要一个.catch来捕获所有异常。