Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在以下承诺结束之前多次发出vue组合api_Javascript_Vue.js_Vue Composition Api - Fatal编程技术网

Javascript 在以下承诺结束之前多次发出vue组合api

Javascript 在以下承诺结束之前多次发出vue组合api,javascript,vue.js,vue-composition-api,Javascript,Vue.js,Vue Composition Api,即使承诺没有结束,下面的“状态”也会发出两次。嗯,我知道每个参数(successData、loading、errored)分别执行得非常好。但每当我合并它们时,就会出现错误 import{computed,reactive,toRefs,watch,ref}来自'@vue/compositionapi'; 从“@vue/composition-api/dist/component”导入{Data}; 导出默认函数usePromise(fn:any){ 如果(!fn){ 抛出新错误(`[usePr

即使承诺没有结束,下面的“状态”也会发出两次。嗯,我知道每个参数(successData、loading、errored)分别执行得非常好。但每当我合并它们时,就会出现错误

import{computed,reactive,toRefs,watch,ref}来自'@vue/compositionapi';
从“@vue/composition-api/dist/component”导入{Data};
导出默认函数usePromise(fn:any){
如果(!fn){
抛出新错误(`[usePromise]:需要第一个参数(必须是函数)`);
}
如果(fn的类型!==‘功能’){
抛出新类型错误(`[usePromise]:参数必须是函数,但收到${typeof fn}`);
}
常数状态:任意=无功({
successData:{},
加载:对,
错误:错误,
错误消息:“”,
错误代码:0,
完:错,,
});
让我们承诺;
const use=async(…args:any)=>{
state.loading=true;
常量promise=(lastPromise=fn(…args));
试一试{
const result=等待承诺;
如果(最后承诺===承诺){
state.successData=result.data;
state.errored=false;
}
}捕获(错误){
如果(!error.response){
state.errorCode=900;
state.errorMessage='网络错误';
}
state.errorMessage=error.response.data.error;
state.errorCode=error.response.status;
state.errored=true;
}最后{
state.loading=false;
state.end=true;
}
};
const responsePayload=已计算(()=>{
返回状态;
});
返回{
责任书,
使用,
};
}
我又试了一次导致了错误

  const responsePayload = computed(() => {
    if (state.end === true) {
      return state;
    }
  });
而且这种事情是不允许的。我只想在承诺结束时才发出一次回应

  const state: any = reactive({
    responsePayload : {
      successData: {},
      loading: true,
      errored: false,
      errorMessage: '',
      errorCode: 0,
      end: false,
    }
  });

方法,如Object.assign。。不工作。 我别无选择,只能这样分别参考所有数据

function useUpdateResetToken(axios) {
  const { successData, errored, errorMessage, errorCode, loading, use: create } = usePromiseFn((toAddress) =>
    axios.post('/api/v1/admin/users/updateResetToken', { toAddress }),
  );
  const updateResetToken = (toAddress) => {
    return create(toAddress);
  };
  return { updateResetToken, successData, errored, errorMessage, errorCode, loading };
}
[更新] 这可以工作,但发射未定义

import { computed, reactive, toRefs, watch, ref } from '@vue/composition-api';
import { Data } from '@vue/composition-api/dist/component';

interface PromiseFields {
  successData: any;
  loading: boolean;
  errored: boolean;
  errorMessage: string;
  errorCode: number;
}

export default function usePromise(fn: any) {
  if (!fn) {
    throw new Error(`[usePromise]: 1st argument is required (must be a function)`);
  }

  if (typeof fn !== 'function') {
    throw new TypeError(`[usePromise]: argument has to be function, but received ${typeof fn}`);
  }

  const _loading = ref(false);
  const state: any = reactive({
    successData: {},
    loading: computed(() => _loading.value),
    errored: false,
    errorMessage: '',
    errorCode: 0,
  });

  let lastPromise;
  const use = async (...args: any) => {
    _loading.value = true;
    const promise = (lastPromise = fn(...args));
    try {
      const result = await promise;
      if (lastPromise === promise) {
        state.successData = result.data;
        state.errored = false;
      }
    } catch (error) {
      if (!error.response) {
        state.errorCode = 900;
        state.errorMessage = 'Network Error';
      }
      state.errorMessage = error.response.data.error;
      state.errorCode = error.response.status;

      state.errored = true;
    } finally {
      _loading.value = false;
    }
  };

  const responsePayload = computed(() => {
    if (_loading.value === false) {
      return state;
    } else {
      return undefined;
    }
  });
  return {
    responsePayload,
    use,
  };
}

import { computed, reactive, toRefs, watch, ref } from '@vue/composition-api';
import { Data } from '@vue/composition-api/dist/component';

interface PromiseFields {
  successData: any;
  loading: boolean;
  errored: boolean;
  errorMessage: string;
  errorCode: number;
}

export default function usePromise(fn: any) {
  if (!fn) {
    throw new Error(`[usePromise]: 1st argument is required (must be a function)`);
  }

  if (typeof fn !== 'function') {
    throw new TypeError(`[usePromise]: argument has to be function, but received ${typeof fn}`);
  }

  const _loading = ref(false);
  const state: any = reactive({
    successData: {},
    loading: computed(() => _loading.value),
    errored: false,
    errorMessage: '',
    errorCode: 0,
  });

  let lastPromise;
  const use = async (...args: any) => {
    _loading.value = true;
    const promise = (lastPromise = fn(...args));
    try {
      const result = await promise;
      if (lastPromise === promise) {
        state.successData = result.data;
        state.errored = false;
      }
    } catch (error) {
      if (!error.response) {
        state.errorCode = 900;
        state.errorMessage = 'Network Error';
      }
      state.errorMessage = error.response.data.error;
      state.errorCode = error.response.status;

      state.errored = true;
    } finally {
      _loading.value = false;
    }
  };

  const responsePayload = computed(() => {
    if (_loading.value === false) {
      return state;
    } else {
      return undefined;
    }
  });
  return {
    responsePayload,
    use,
  };
}