从Axios返回承诺?

时间:2016-08-19 18:44:07

标签: javascript promise axios

我想知道如何返回Axios的承诺表格?我不确定是否需要使用拦截器?

我现在有这个代码

export function fetchStorage() {
    return function (dispatch) {
      return new Promise(function(resolve, reject) {
        if (1 === 1) {
          resolve('it works!');
        } else {
          reject(':(');
        }
      });
    };
}

this.props.fetchStorage().then(function() {
           console.log('then');
        });

现在说我想改变fetchStorage通过ajax做一些事情,我希望它能像

一样
 var instance = axios.create({
            baseURL: 'http://localhost:54690/api',
            timeout: 2000,

        });

        instance.get('/Storage/Get')
            .then(function (response) {
                console.log(response);
            })
            .catch(function (error) {
                console.log(error);
            });

如何返回承诺而不是在此处执行?

编辑

为了澄清为什么我这样做,我有类似的东西

  componentWillMount() {
        this.props.setPreLoader(true);
        this.props.fetchStorage().then(function() {
           this.props.setPreLoader(false);
        });
    }

export function fetchStorage() {
    return function (dispatch) {
        return new Promise(function (resolve, reject) {
            axiosInstant.get('/Storage/Get')
                .then(function (response) {
                    let payload = response.data;
                    console.log(payload);
                    dispatch({ type: actions.FETCH_STORAGE, payload: { storages: payload } });
                })
                .catch(function (error) {
                    console.log(error);
                });
        });
    };
}

3 个答案:

答案 0 :(得分:0)

必须有更好的方法,但是您可以

export async function fetchStorage() {
    return async function (dispatch) {
        try {
            const { data } = await axiosInstant.get('/Storage/Get')
            dispatch({ type: actions.FETCH_STORAGE, payload: { storages: data } })
            return data
        } catch (e) {
            console.error(e)
        }
    }
}

然后您必须按以下方式使用fetchStorage

this.props.fetchStorage().then(async function(response) {
    let payload = await response()
});

答案 1 :(得分:0)

Axios基于承诺,因此您无需将其包装在Promise中, 您可以执行以下操作和axiosInstance。[post | put | get | end等]方法将返回promise。

export function fetchStorage() {
    return function (dispatch) {
       return axiosInstant.get('/Storage/Get')
                .then(function (response) {
                    let payload = response.data;
                    console.log(payload);
                    dispatch({ type: actions.FETCH_STORAGE, payload: { storages: payload } });
                })
                .catch(function (error) {
                    console.log(error);
                });
    };
}

答案 2 :(得分:-5)

见样本:

 return new Promise(function (resolve, reject) {
    var instance = axios.create({
        baseURL: 'http://localhost:54690/api',
        timeout: 2000,
    });
    instance.get('/Storage/Get')
        .then(function (response) {
            if(1 === 1)
            resolve(response);
        })
        .catch(function (error) {
            reject(error);
        });

 });