【问题标题】:Promise resolve and reject in javascriptjavascript中的承诺解决和拒绝
【发布时间】:2019-08-06 11:25:46
【问题描述】:

我正在尝试在 NativeScript 上构建一个移动应用程序,我在其中创建了一个授权类,该类具有 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')
                });
        })
    }

}

我将这个类包含在我的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:无法读取未定义的属性“then”。框架:function:'login'

帮我解决这个问题。谢谢。

【问题讨论】:

  • login 方法在 NitsEditorAuth 中返回 nothing
  • @briosheje 你的意思是login 类中的NitsEditorAuth 方法?
  • 是的,在我看来,这里抛出了错误:this.$nitsEditorAuth .login(this.user) undefined 因为你的axios 调用没有返回,仅此而已,真的,你非常接近解决方案。只需在axios 之前添加return,它应该可以按预期工作,尽管出于设计目的我仍然会返回Promise(自定义承诺)。

标签: javascript node.js vue.js nativescript nativescript-vue


【解决方案1】:

简单的解决方法就是在函数外包装一个承诺。并删除其余部分。 例如。

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

【讨论】:

  • 出于设计目的,对我来说,这是最干净的解决方案。
  • 是的,通过这样做,你可以确保在哪里调用这个函数,告诉它等待,它返回了一个承诺。一旦它解决了,它将调用 then 方法或如果被拒绝则 catch。
【解决方案2】:

您没有返回 axios 在 login 方法中返回的承诺(以及对 axios.get(apiUrl + 'user/log', 的内部调用),从而破坏了承诺链

return axios.post(authUrl...

来自then handlers of Promises are chained 的返回值,请参见此示例:

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

【讨论】:

  • 但是在调用 authUrl 之后我还有一个 axios 调用。打电话给第一个可以吗?
  • @NitishKumar 也在那里添加返回。否则,将所有内容包装在 Promise 块中,并仅在主 Promise 上调用 resolve。
  • 它们是嵌套的thens,返回的是你从最里面返回的then,你必须确保所有的returns都被链接起来
【解决方案3】:

在您的登录功能中,您在 axios 后调用中返回了一个承诺,该承诺本质上是异步的。您应该返回承诺的函数没有返回任何内容。所以你可以参考下面的代码。

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

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    您可以使用异步/等待模式。

    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';
      }
    }
    

    【讨论】:

    • 如果可以使用async/await,这是最简单的方法
    猜你喜欢
    • 2023-03-26
    • 2013-06-22
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2016-01-16
    • 2021-11-02
    相关资源
    最近更新 更多