在函数中包装两个 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
即可捕获所有异常。
我对 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
即可捕获所有异常。