承诺在 javascript 中解决并拒绝
Promise resolve and reject in javascript
我正在尝试在 NativeScript
上构建一个移动应用程序,我在其中创建了一个 class 用于授权,它具有 login()
函数,该函数具有以下代码:
export default class NitsEditorAuth {
//Finding logged-in user.
isLoggedIn() {
return store.getters.access_token ? true : false;
}
//For Login user
login(user) {
const postData = {
grant_type: 'password',
username: user.email,
password: user.password,
client_id: clientId,
client_secret: clientSecret,
scope: '',
provider: provider
}
const authUser = {}
axios.post(authUrl, postData).then(response => {
if(response.status === 200)
{
authUser.access_token = response.data.access_token;
authUser.refresh_token = response.data.refresh_token;
axios.get(apiUrl + 'user/log', {headers: getHeader()}).then(response => {
if(response.status === 200){
authUser.email = response.data.email;
authUser.first_name = response.data.first_name;
authUser.last_name = response.data.last_name;
authUser.userRole = response.data.role;
store.commit('save', authUser);
return new Promise(function (resolve, reject) {
resolve('Login successful')
});
}
})
}
})
.catch((err) => {
if(err.response.status === 401){
// this.error = err.response.data.message
return new Promise(function (resolve, reject) {
reject('Validation error')
});
}
else
return new Promise(function (resolve, reject) {
reject('Something went wrong')
});
})
}
}
我将这个 class 包含在我的 main.js
文件中:
const nitsEditorAuth = new NitsEditorAuth();
Vue.prototype.$nitsEditorAuth = nitsEditorAuth;
我在 Vue-methods
中调用此函数,例如:
login() {
this.$nitsEditorAuth
.login(this.user)
.then(() => {
this.processing = false;
this.$navigateTo(Home, { clearHistory: true });
})
.catch(() => {
this.processing = false;
this.alert(
"Unfortunately we could not find your account."
);
});
},
但我收到错误说明:
TypeError: Cannot read property 'then' of undefined. Frame: function:'login'
帮我解决这个问题。谢谢。
您没有返回 axios 在您的 login
方法中返回的承诺(以及对 axios.get(apiUrl + 'user/log',
的内部调用,从而破坏了承诺链
return axios.post(authUrl...
来自 then handlers of Promises are chained 的 Return 值,请参阅此示例:
// a here points to a promise that will resolve to "Just the 2 of us"
const a = Promise.resolve(1)
.then(val => val + val)
.then(val => `Just the ${val} of us`);
a.then(val => console.log(val))
简单的解决方法就是在函数外包装一个 promise。并删除其余部分。
例如。
javascript node.js vue.js nativescript nativescript-vue
I'm trying to build a mobile application on NativeScript where I've created a class for authorization which has a login() function which has following codes:
export default class NitsEditorAuth {
//Finding logged-in user.
isLoggedIn() {
return store.getters.access_token ? true : false;
}
//For Login user
login(user) {
const postData = {
grant_type: 'password',
username: user.email,
password: user.password,
client_id: clientId,
client_secret: clientSecret,
scope: '',
provider: provider
}
return new Promise(function (resolve, reject) {
const authUser = {}
axios.post(authUrl, postData).then(response => {
if(response.status === 200)
{
authUser.access_token = response.data.access_token;
authUser.refresh_token = response.data.refresh_token;
axios.get(apiUrl + 'user/log', {headers: getHeader()}).then(response => {
if(response.status === 200){
authUser.email = response.data.email;
authUser.first_name = response.data.first_name;
authUser.last_name = response.data.last_name;
authUser.userRole = response.data.role;
store.commit('save', authUser);
resolve('Login successful')
}
})
}
})
.catch((err) => {
if(err.response.status === 401){
// this.error = err.response.data.message
reject('Validation error')
}
else
reject('Something went wrong')
})
})
}
在您的登录功能中,您在 axios post 调用中 return 进行了一个本质上异步的承诺。您应该 return 承诺的功能不是 returning 任何东西。所以你可以参考下面的代码。
login() {
let promise = new Promise(function(resolve, reject) {
// your post call (dummy data)
axios.post(authUrl, postData).then(response => {
if(response.status === 200) {
resolve('foo');
} else {
reject('Login successful');
}
});
return promise;
}
希望对您有所帮助。
您可以使用 async/await 模式。
async login(user) {
const postData = {
grant_type: 'password',
username: user.email,
password: user.password,
client_id: clientId,
client_secret: clientSecret,
scope: '',
provider: provider
};
const authUser = {};
try {
const postResponse = await axios.post(authUrl, postData);
if (postResponse.status === 200) {
authUser.access_token = response.data.access_token;
authUser.refresh_token = response.data.refresh_token;
const response = await axios.get(apiUrl + 'user/log', {headers: getHeader()});
if (response.status === 200) {
authUser.email = response.data.email;
authUser.first_name = response.data.first_name;
authUser.last_name = response.data.last_name;
authUser.userRole = response.data.role;
store.commit('save', authUser);
return 'Login successful';
}
}
return 'Validation error';
}
catch(err) {
if (err.response.status === 401){
return 'Validation error';
}
return 'Something went wrong';
}
}
我正在尝试在 NativeScript
上构建一个移动应用程序,我在其中创建了一个 class 用于授权,它具有 login()
函数,该函数具有以下代码:
export default class NitsEditorAuth {
//Finding logged-in user.
isLoggedIn() {
return store.getters.access_token ? true : false;
}
//For Login user
login(user) {
const postData = {
grant_type: 'password',
username: user.email,
password: user.password,
client_id: clientId,
client_secret: clientSecret,
scope: '',
provider: provider
}
const authUser = {}
axios.post(authUrl, postData).then(response => {
if(response.status === 200)
{
authUser.access_token = response.data.access_token;
authUser.refresh_token = response.data.refresh_token;
axios.get(apiUrl + 'user/log', {headers: getHeader()}).then(response => {
if(response.status === 200){
authUser.email = response.data.email;
authUser.first_name = response.data.first_name;
authUser.last_name = response.data.last_name;
authUser.userRole = response.data.role;
store.commit('save', authUser);
return new Promise(function (resolve, reject) {
resolve('Login successful')
});
}
})
}
})
.catch((err) => {
if(err.response.status === 401){
// this.error = err.response.data.message
return new Promise(function (resolve, reject) {
reject('Validation error')
});
}
else
return new Promise(function (resolve, reject) {
reject('Something went wrong')
});
})
}
}
我将这个 class 包含在我的 main.js
文件中:
const nitsEditorAuth = new NitsEditorAuth();
Vue.prototype.$nitsEditorAuth = nitsEditorAuth;
我在 Vue-methods
中调用此函数,例如:
login() {
this.$nitsEditorAuth
.login(this.user)
.then(() => {
this.processing = false;
this.$navigateTo(Home, { clearHistory: true });
})
.catch(() => {
this.processing = false;
this.alert(
"Unfortunately we could not find your account."
);
});
},
但我收到错误说明:
TypeError: Cannot read property 'then' of undefined. Frame: function:'login'
帮我解决这个问题。谢谢。
您没有返回 axios 在您的 login
方法中返回的承诺(以及对 axios.get(apiUrl + 'user/log',
return axios.post(authUrl...
来自 then handlers of Promises are chained 的 Return 值,请参阅此示例:
// a here points to a promise that will resolve to "Just the 2 of us"
const a = Promise.resolve(1)
.then(val => val + val)
.then(val => `Just the ${val} of us`);
a.then(val => console.log(val))
简单的解决方法就是在函数外包装一个 promise。并删除其余部分。 例如。
javascript node.js vue.js nativescript nativescript-vue
I'm trying to build a mobile application on NativeScript where I've created a class for authorization which has a login() function which has following codes:
export default class NitsEditorAuth {
//Finding logged-in user.
isLoggedIn() {
return store.getters.access_token ? true : false;
}
//For Login user
login(user) {
const postData = {
grant_type: 'password',
username: user.email,
password: user.password,
client_id: clientId,
client_secret: clientSecret,
scope: '',
provider: provider
}
return new Promise(function (resolve, reject) {
const authUser = {}
axios.post(authUrl, postData).then(response => {
if(response.status === 200)
{
authUser.access_token = response.data.access_token;
authUser.refresh_token = response.data.refresh_token;
axios.get(apiUrl + 'user/log', {headers: getHeader()}).then(response => {
if(response.status === 200){
authUser.email = response.data.email;
authUser.first_name = response.data.first_name;
authUser.last_name = response.data.last_name;
authUser.userRole = response.data.role;
store.commit('save', authUser);
resolve('Login successful')
}
})
}
})
.catch((err) => {
if(err.response.status === 401){
// this.error = err.response.data.message
reject('Validation error')
}
else
reject('Something went wrong')
})
})
}
在您的登录功能中,您在 axios post 调用中 return 进行了一个本质上异步的承诺。您应该 return 承诺的功能不是 returning 任何东西。所以你可以参考下面的代码。
login() {
let promise = new Promise(function(resolve, reject) {
// your post call (dummy data)
axios.post(authUrl, postData).then(response => {
if(response.status === 200) {
resolve('foo');
} else {
reject('Login successful');
}
});
return promise;
}
希望对您有所帮助。
您可以使用 async/await 模式。
async login(user) {
const postData = {
grant_type: 'password',
username: user.email,
password: user.password,
client_id: clientId,
client_secret: clientSecret,
scope: '',
provider: provider
};
const authUser = {};
try {
const postResponse = await axios.post(authUrl, postData);
if (postResponse.status === 200) {
authUser.access_token = response.data.access_token;
authUser.refresh_token = response.data.refresh_token;
const response = await axios.get(apiUrl + 'user/log', {headers: getHeader()});
if (response.status === 200) {
authUser.email = response.data.email;
authUser.first_name = response.data.first_name;
authUser.last_name = response.data.last_name;
authUser.userRole = response.data.role;
store.commit('save', authUser);
return 'Login successful';
}
}
return 'Validation error';
}
catch(err) {
if (err.response.status === 401){
return 'Validation error';
}
return 'Something went wrong';
}
}