Dùng gì để khi nhận dữ liệu sẽ chạy 1 method?

Chào cả nhà
Mình mới học javascript nên có gặp chút vấn đề, mình có đoạn code sau nhờ cả nhà giúp:

uploadfile(file){
     bucket.upload(params, function (err, data) {
         console.log('Successfully uploaded file.', data);
         return true;
     });
}
}
getfile(){
     this.uploadfile(this.file) // đoạn mình muốn chạy một method khác khi có dữ liệu trả về
}

cái bucket kia có upload file và sẽ mất thời gian trả về, làm sao để khi nhận được dữ liệu trả về mình có thể chạy một method khác ạ?

Mình lấy đoạn này bạn có callback mà ta ??

1 Like

Chính là cái hàm trong bucket.upload đấy. Truyền 1 hàm vào và gọi nó. Như này:

uploadfile(file, cb) {
    bucket.upload(params, function(err, data) {
        console.log('Successfully uploaded file.', data);
        cb(); // nó đây.
        return true;
    });
}
callback(){
// muốn làm gì?
}

getfile() {
    this.uploadfile(this.file, callback);
}

Hoặc cách này bớt loằng ngoằng:

uploadfile(file, cb) {
    bucket.upload(params, cb);
}
getfile() {
    this.uploadfile(this.file, function(err, data){
    console.log('Successfully uploaded file.', data);
// muốn làm gì?
    });
}

3 Likes

Cảm ơn bạn ạ!!!

Bạn có thể cho mình hỏi thêm về vấn đề này được không ạ?!
mình không thể nào thay đổi được giá trị trong phần callback ạ, cả 3 cái trong cái callback đều là undifined
Untitled

this? Sao lại dùng this. bạn muốn lấy gì?

Cái chỗ tham số truyền vào cho hàm callback đó bạn lấy nó ra là ra giá trị. Bạn nên debug xem data trả về như thế nào!

mình gọi cái này ạ

public receipt_img_url: string = '';

mình debug nó ra giá trị rồi nhưng ko thể thay đổi được caác đối tượng bên ngoài,

callback(url, name) {
    this.receipt_img_url = url; //"Cannot read property 'receipt_img_url' of undefined"
    this.filename = name //"Cannot read property 'filename' of undefined"
  }
  upload() {
    console.log('upload');
    let fileBrowser = this.fileInput.nativeElement;
    if (fileBrowser.files && fileBrowser.files[0]) {
      var formData: FormData = new FormData();
      var img: File = fileBrowser.files[0];
      formData.append("image", img, img.name);

      this.dataService.uploadfile(img, this.playertoken, this.callback)
}
 public receipt_img_url: string = '';// đối tượng cần thay đổi trong callback
 public filename: string = "";// đối tượng cần thay đổi trong callback
 export class DataService {
       uploadfile(file, playertoken, cb) {
       bucket.upload(params, function(err, data) {
        console.log('Successfully uploaded file.', data);
        cb(); 
        return true;
    });
}
 }

Code của mình, phiền mọi người xem giúp ạ

nhìn code bạn đưa tui chẳng biết phải hướng dẫn sữa ntn. Bạn đưa code hết lên xem?

mình có thêm chú thích phiền bạn kiểm tra

Thiệt tình là code bạn đưa thiếu 1 ngoặc }
bạn thử đưa 2 dòng public lên trên hàm callback thử xem. Và không cần gọi this.

 public receipt_img_url: string = '';// đối tượng cần thay đổi trong callback
 public filename: string = "";// đối tượng cần thay đổi trong callback

ok now, thanks bạn ạ, cái này phải thêm bind vào contructor của angular,

Thay vì dùng callback thì bạn có thể sửa uploadfile để nó return promise.

uploadfile(file){
    return new Promise((resolve, reject) => {
	    bucket.upload(params, function (err, data) {
            if (err) reject(err);
		    else {
		       console.log('Successfully uploaded file.', data);
               resolve(data);
		    }
        });
	})
}

getfile(){
    this.uploadfile(this.file)
	.then(data => { /* Xử lý trường hợp thành công */})
	.catch(err => { /* Xử lý trường hợp lỗi */});
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?