在函数中包装两个 promise

Wrap two promise in a function

我对 promise 的 return 有一些疑问。之前,在 http 调用期间,我使用了这样的函数 returning 一个承诺:

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
})

罪魁祸首是时间戳。我用它来进行一些身份验证,为什么不重要,但是通过从客户端获取它,我经常成为错误的 horloge 或系统本地设置为另一种语言的受害者。

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

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;
                });
        });
    },

但我不确定我应该做什么 return。我应该 return get_timestamp 承诺并在 "then" 中等待其他请求结束吗?我是否应该将 get_timestamp 设为同步调用,因为毕竟它只是一个小日期字符串? 我在我的代码中一直使用旧功能,所以一种只保留旧功能的方法(当时只有一个)会很棒。

一如既往地感谢大家。

你会这样写:

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 returns 通过链创建的最后一个 Promise,调用返回的 Promise .catch(function(response) {...}

您应该链接 Promise 和 return 链接的结果:

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 即可捕获所有异常。