javascript - Vue.js 从服务发出事件

标签 javascript vue.js ecmascript-6 vuejs2 vue-component

我想知道如何从 .js 文件(提供文件上传服务的类)向组件发出事件。我的想法是为进度 UI 元素发出四个事件。

我的服务 .js 文件是这样的:

import Vue from 'vue';

export const UploaderService = new Vue({
 methods: {
    orchestrateDataPublication() {
        return new Promise((resolve, reject) => {
            if (this.checkRequiredData()) {
                // emit 25% done
                this._getSignedUrl().then(signedUrlResponse => {
                 // emit 50% done
              this._uploadDataset(signedUrlResponse).then(uploadResponse => {

等等。

这是在 Vue 组件中导入的:

<script>
import {UploaderService} from '../service/uploaderService.js'
export default {
        upload () {
        this.$refs['datasetForm'].validate((valid) => {
            if (valid) {
                UploaderService.orchestrateDataPublication().then((response) => {
                    this.$emit(response.type, response.data)
                }, (err) => {
                    this.$emit(err.type, err.data)
                })
            } else {
                this.$emit('appInforms', ' -PLEASE, check all your inputs- ')
            }
        })
    }

此处上传使用 orchestrateDataPublication 作为 promise ,但我需要以某种方式发出事件。这可能吗?

最佳答案

因为 UploaderService 本身是一个 Vue 实例,你可以使用它的 $on -监听事件的方法,以及$emit - 调度事件的方法。上传完成后,您可以使用 $off停止收听进度事件。

upload() 中,为我们称为“progress”的事件设置事件监听器,然后调用 UploaderService.orchestrateDataPublication(),并停止监听进度then 回调中的事件:

upload() {
  UploaderService.$on('progress', progress => console.log({ progress }));

  UploaderService.orchestrateDataPublication().then(message => {
    console.log({ message });
    UploaderService.$off('progress');
  });
}

UploaderService.orchestrateDataPublication() 中,发出这样的进度事件:

this.$emit('progress', 0.75); // 75% complete

demo

注意:如果您的项目允许 ES2017,您可以使用 async/await 来减少回调嵌套,如 codesandbox 所示.

关于javascript - Vue.js 从服务发出事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52103882/

相关文章:

javascript - 用一个元素初始化数组,如果数组存在则压入元素

javascript - Mocha 将变量传递给下一个测试

javascript - Angular-js uglify 下载的模块

javascript - 在执行 Angular 2 CLI 项目时如何添加第三方包

javascript - FlaskWTF 如何向 Vue 前端发送 CSRF token

javascript - Vue.js:仅当条件为真时才阻止表单提交

javascript - import { AppRegistry } from 'react-native' 之间的区别;并从 'react-native' 导入 AppRegistry ;

javascript - 触发单击具有特定类和属性的元素

vue.js - 如何在 vue3 设置中强制更新?

JavaScript 通过两个参数过滤