在 Promise 中包装 Auth0 的 parseHash 函数
Wrapping Auth0's parseHash function in a Promise
auth0.js
有一个函数,用于解析 URL 散列片段并从中提取认证结果。我将这个函数包装在一个名为 loadSession
的函数中,如下所示:
public loadSession(): void {
this.auth0.parseHash((err, authResult) => {
if (authResult) {
window.location.hash = '';
localStorage.setItem('token', authResult.accessToken);
// TODO (1)
} else if (err) {
// TODO (2)
}
});
}
如上所示,parseHash
将回调函数作为参数,我无法控制它。我希望 loadSession
到 return 一个 Promise
将在 // TODO (1)
处解决并在 // TODO (2)
处被拒绝。这样我就可以做到obj.loadSession().then(() => { // do something if successful }).catch((err) => { // raise error if not })
简单地将它包装在一个承诺中:
public loadSession() {
return new Promise((resolve, reject) => {
this.auth0.parseHash((err, authResult) => {
if(authResult) {
window.location.hash = '';
localStorage.setItem('token', authResult.accessToken);
resolve(authResult);
} else if (err) {
reject(err);
}
});
});
}
public loadSession(): Promise {
return new Promise((resolve, reject) => {
this.auth0.parseHash((err, authResult) => {
if (authResult) {
window.location.hash = '';
localStorage.setItem('token', authResult.accessToken);
// TODO (1)
// resolve(something)
} else if (err) {
// TODO (2)
// reject(something)
}
});
}
有关使用Promise
API的更多信息,您可以访问MDN Docs
您几乎可以将任何回调函数传递给 returns 给定承诺的函数:
- 回调是最后一个参数
- 回调函数将错误作为第一个参数
这是一个例子:
const asPromise =
(context) =>
(fn) =>
(args) =>
new Promise(
(resolve,reject) =>
fn.apply(
context,
(args||[]).concat(
function(){
if(arguments[0]){
reject(arguments[0]);return;
}
resolve(Array.from(arguments).slice(1));
}
)
)
);
// to apply parseHash on auth0
public loadSession(): Promise {
return asPromise(this.auth0)(this.auth0.parseHash)()
.then(
([authResult])=>{
if (authResult) {
window.location.hash = '';
localStorage.setItem('token', authResult.accessToken);
//whatever you return here is the resolve
return authResult;
}
//just throw in a promise handler will return a rejected promise
// this is only for native promises, some libraries don't behave
// according to spec so you should test your promise polyfil if supporting IE
throw "Promise resolved but got no authResult";
}
)
}
或者您可以使用一个小型库来为您完成此操作:promisify-auth0 on GitHub, promisify-auth0 on npmjs.org。
现已更新至版本 9.5.1
。
auth0.js
有一个函数,用于解析 URL 散列片段并从中提取认证结果。我将这个函数包装在一个名为 loadSession
的函数中,如下所示:
public loadSession(): void {
this.auth0.parseHash((err, authResult) => {
if (authResult) {
window.location.hash = '';
localStorage.setItem('token', authResult.accessToken);
// TODO (1)
} else if (err) {
// TODO (2)
}
});
}
如上所示,parseHash
将回调函数作为参数,我无法控制它。我希望 loadSession
到 return 一个 Promise
将在 // TODO (1)
处解决并在 // TODO (2)
处被拒绝。这样我就可以做到obj.loadSession().then(() => { // do something if successful }).catch((err) => { // raise error if not })
简单地将它包装在一个承诺中:
public loadSession() {
return new Promise((resolve, reject) => {
this.auth0.parseHash((err, authResult) => {
if(authResult) {
window.location.hash = '';
localStorage.setItem('token', authResult.accessToken);
resolve(authResult);
} else if (err) {
reject(err);
}
});
});
}
public loadSession(): Promise {
return new Promise((resolve, reject) => {
this.auth0.parseHash((err, authResult) => {
if (authResult) {
window.location.hash = '';
localStorage.setItem('token', authResult.accessToken);
// TODO (1)
// resolve(something)
} else if (err) {
// TODO (2)
// reject(something)
}
});
}
有关使用Promise
API的更多信息,您可以访问MDN Docs
您几乎可以将任何回调函数传递给 returns 给定承诺的函数:
- 回调是最后一个参数
- 回调函数将错误作为第一个参数
这是一个例子:
const asPromise =
(context) =>
(fn) =>
(args) =>
new Promise(
(resolve,reject) =>
fn.apply(
context,
(args||[]).concat(
function(){
if(arguments[0]){
reject(arguments[0]);return;
}
resolve(Array.from(arguments).slice(1));
}
)
)
);
// to apply parseHash on auth0
public loadSession(): Promise {
return asPromise(this.auth0)(this.auth0.parseHash)()
.then(
([authResult])=>{
if (authResult) {
window.location.hash = '';
localStorage.setItem('token', authResult.accessToken);
//whatever you return here is the resolve
return authResult;
}
//just throw in a promise handler will return a rejected promise
// this is only for native promises, some libraries don't behave
// according to spec so you should test your promise polyfil if supporting IE
throw "Promise resolved but got no authResult";
}
)
}
或者您可以使用一个小型库来为您完成此操作:promisify-auth0 on GitHub, promisify-auth0 on npmjs.org。
现已更新至版本 9.5.1
。