Yêu cầu thg 1 3, 2019 2:06 SA 1540 0 1
  • 1540 0 1
+1

Vuejs: vấn đề bất đồng bộ

Chia sẻ
  • 1540 0 1

Chào mọi người, em đang làm về vuejs, em có hàm:

data() {
    return {
        subjects: []
    }
}
async getReports() {
    const subjects = await axios('/reports');
    this.subjects = subjects.data;
    this.loading = false;
    console.log(this.subjects)
},

ở hàm created, em có:

created() {
    this.getReports();
    console.log(this.subjects)
},

ở trong hàm getReports() thì nó lấy được đúng kết quả, còn ở trong hàm created()thì nó lại trả về rỗng. vậy cho em hỏi là tại sao ạ. và cách khắc phục là như thế nào ạ? em cám ơn!!!

Avatar Vũ Nguyễn @vunguyen10111995
thg 1 3, 2019 2:30 SA

bạn thử đặt trong mounted() xem sao.

thg 1 3, 2019 2:31 SA

@vunguyen10111995 mình đã thử rồi nhưng ở template bên trên, nó lại vẫn không nhận biết subjects đó. nó vẫn rỗng., không thể dùng được ở template bên trên. không biết tại sao

Avatar Vũ Nguyễn @vunguyen10111995
thg 1 3, 2019 2:35 SA

@hai2 ý mình là bạn gọi thẳng cái axios('/report') xong hàm mounted rồi set data luôn trong cái hàm then của nó thử xem, thay vì việc bạn phải gọi async await methods

thg 1 3, 2019 2:41 SA

@vunguyen10111995 mình cho vào mounted() xong console.log(this.subjects) thì nó là undefined luôn =)

thg 1 3, 2019 2:41 SA

1 CÂU TRẢ LỜI


Đã trả lời thg 1 3, 2019 2:22 SA
Đã được chấp nhận
+5

khi e khai báo async getReports() thì kết quả trả về là một promise, nên khi e gọi this.getReports(); trong created thì nó vẫn chỉ là một promise thôi chứ chưa trả về kết quả.

e thử thay như này xem chạy được ko ?

async created() {
        await this.getReports();
        console.log(this.subjects)
    },
Chia sẻ
thg 1 3, 2019 2:26 SA

@kiendinang em làm theo anh thì nó show ra kêts quả rồi, nhưng ở template bên trên, nó lại vẫn không nhận biết subjects đó. nó vẫn rỗng., không thể dùng được ở template bên trên ạ.

thg 1 3, 2019 2:28 SA

@kiendinang à mà em nghĩ khi mình gọi đến hàm this.getReports() rồi thì biến this.subjects đã được gán giá trị rồi nên ở hàm created chỉ show cái biến this.subjects là dc ạ?

Avatar Do Trung Kien @kiendinang
thg 1 3, 2019 2:37 SA

@hai2 anh ko rõ template của e show data như thế nào, nhưng nếu e đã log được this.subjects ở cả 2 function thì có nghĩa là nó đã được set đúng.

e thử show code template kèm logic vue component lên đây xem sao.

thg 1 3, 2019 2:39 SA

@kiendinang đây ạ

<tbody v-for="(subject, x) in subjects" :key="x">
                        <tr v-for="(n,index) in subject.day" :key="n">
                            <td>
                                <h3>{{ subject.name }}</h3>
                                ({{ subject.day }} day)
                                <hr>
                                <div>Day: {{ n }}</div>
                            </td>
                            <template v-if="subjects[x].reports[n - 1].day == n">
                                <td class="p-0 pl-1 pr-1">
                                    <div
                                        class="edittor"
                                        @click="edittingReport($event, subjects[x].reports[n - 1].id, 'content')"
                                        v-html="subjects[x].reports[n - 1].content"
                                    ></div>
                                </td>
                                <td class="p-0 pl-1 pr-1">
                                    <div
                                        class="edittor"
                                        @click="edittingReport($event, subjects[x].reports[n - 1].id, 'link')"
                                        v-html="subjects[x].reports[n - 1].link"
                                    ></div>
                                </td>
                                <td class="p-0 pl-1 pr-1">
                                    <div
                                        class="edittor"
                                        @click="edittingReport($event, subjects[x].reports[n - 1].id, 'test_link')"
                                        v-html="subjects[x].reports[n - 1].test_link"
                                    ></div>
                                </td>
                                <td class="p-0 pl-1 pr-1">
                                    <div
                                        class="edittor"
                                        @click="edittingReport($event, subjects[x].reports[n - 1].id, 'lesson')"
                                        v-html="subjects[x].reports[n - 1].lesson"
                                    ></div>
                                </td>
                                <td class="p-0 pl-1 pr-1">
                                    <div
                                        class="edittor"
                                        @click="edittingReport($event, subjects[x].reports[n - 1].id, 'status')"
                                        v-html="subjects[x].reports[n - 1].status"
                                    ></div>
                                </td>
                                <td class="p-0 pl-1 pr-1">
                                    <div v-html="subjects[x].reports[n - 1].review"></div>
                                </td>
                            </template>
                        </tr>
                    </tbody>```
thg 1 3, 2019 2:44 SA
thg 1 3, 2019 2:49 SA

@kiendinang tức là kết quả là:Screenshot from 2019-01-03 09-44-27.png và em show ra

subjects[x].reports[n - 1]

thì trả về json đúng.

{ "id": 1, "content": "sdfd sfsd f", "link": "sdf sd", "test_link": "sd fsdf sd", "lesson": "sdfsd", "status": "sd", "day": 1, "user_id": 4, "subject_id": 1, "created_at": "2019-01-02 00:00:00", "updated_at": "2019-01-02 00:00:00", "review_id": 1, "review": "fsdfsdfds" }

. nhưng

subjects[x].reports[n - 1].day

thì lại là k có giá trị

Avatar Do Trung Kien @kiendinang
thg 1 3, 2019 3:15 SA

@hai2 trên chrome console của e có hiện lỗi gì không ? số lượng reports trong mỗi subject có đúng bằng số subject.day không ?

thg 1 3, 2019 3:15 SA

@hai2 thử thêm v-if="subjects != undefined" xem anh

thg 1 3, 2019 3:17 SA

@kiendinang Screenshot from 2019-01-03 10-16-43.png

ở trên console báo lỗi này ạ

thg 1 3, 2019 3:18 SA

@tiennguyen98 đây là nó không đọc được day ở trong subjects[x].reports[n - 1] mà chú?

Avatar Do Trung Kien @kiendinang
thg 1 3, 2019 3:22 SA

@hai2 lỗi này có nghĩa là bản thân cái subjects[x].reports[n - 1] của em đã không tồn tại rồi, e cần check lại xem vài điều:

  • dữ liệu đã trả về chưa? nếu trả về rồi (tức subjects có tồn tại) thì mới thực hiện v-for đối với subjects
  • check lại reports có tồn tại trong subject hay không ?
  • check lại số lượng report có bằng số lượng day hay không ?
  • ko cần thiết lắm nhưng có thể check thêm index khi for, kiểu dữ liệu trả về của các phần tử trong subjects (array or object) đã đúng hay chưa ?
thg 1 3, 2019 3:25 SA

@kiendinang vâng, em cám ơn anh, để em check lại ạ

thg 1 3, 2019 3:39 SA

@kiendinang em tìm ra lỗi rồi ạ, do dữ liệu report của em không có đủ các day nên những cái không có dữ liệu nó báo lỗi

thg 1 3, 2019 3:39 SA

@kiendinang em cám ơn anh ạ

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí