Callback + Vòng lập



  • Chào mọi người.
    Mình muốn hỏi về callback + vòng lập.
    Mình có một vòng lập và 1 hàm. Muốn mõi lần thực hiện 1 lần vòng lập thì gọi 1 lần hàm đó.
    Nhưng hàm đó chạy quá lâu so với cái vòng lập.
    Nên nó chỉ gọi được vài lần đến khi vòng lập xong.

      for(var i=1; i <= result ; i++){      
    
      layData(index+i);   
      
       }
    

    Ví dụ ở đây mình muốn mõi lần lập thì mình gọi hàm layData() 1 lần thì phải thế nào?

    Cảm ơn các bác đã đọc!



  • theo em thấy trg hợp của bác, layData() chắc là hàm vào ra, nên bác nên tạo callback sau khi get dữ liệu xong
    hi vọng vd của em giúp đc bác:

    ttt
    var request = require('request');
    var arr = ['http://www.google.com', 'http://www.google.com.vn'];

    var layData = function(err, index){
    var newIndex = index+ 1;
    if(err) return layData(null,newIndex);
    if(index>=arr.length) { console.log('end loop');return true; }
    request(arr[index], function (error, response, body) {
    if (error) {
    console.log('statusCode:', 'my bad');
    return layData(error);
    }
    console.log('statusCode:', response.statusCode);
    return layData(null,newIndex);
    });
    };

    layData(null,0);



  • @Diep-Gepa OK thanks. Để mình thử



  • Bạn thử sử dụng promise.all nhé.
    var promises = [];
    For {
    promises .push(call function);
    }
    Promise.all(promises )
    .then(result => {
    Mọi thứ đã xong, bạn có quyền dùng result.
    Yên tâm vì các hàm đã add sẽ chạy theo thứ tự
    })
    .catch(err => {
    Nếu có lỗi gì trong quá trình chạy for gọi hàm, thì sẽ đổ về đây hết.
    });

    Chúc bạn thành công, mong sẽ giúp được bạn.



  • Ý tưởng là sử dụng gọi hàm đệ quy như ví dụ dưới đây.

    var arr = [1, 2, 3, 4, 5];
    var sum = 0;
    
    (function iterator(index) {
        if (index == arr.length) {
            // end of loop
            console.log(sum);
            return;
        }
    
        // do something for each element of arr
        sum += arr[index];
        iterator(index + 1);
    })(0);
    


  • bạn có thể sử dụng async/await kết hợp với promise
    //ES6 + nodejs 7.6 trở lên
    function ngu_promise(i) {
    return new Promise((resolve, reject) => {
    setTimeout(function(){
    resolve("ngu_promise"+ i);
    }, 1000);
    });
    }

    async function dongbo() {
    for(var i = 0; i < 3; i++){
    console.log( await ngu_promise(i) );
    }
    }
    dongbo();

    bạn có thể tham khảo thêm video để biết thêm https://www.youtube.com/watch?v=vd111vFlaMk



  • @NguyenQuan phải nói bạn vô cùng nhiệt tình, làm hẳn một video để mô tả 1 đoạn code ....



  • Em thấy các bác toàn dùng dao mổ trâu đi giết gà. Nếu không quá phức tạp thì chỉ là đệ quy và callback bất đồng bộ thôi mà, nếu mới làm quen thì nên theo p/a đó. Đã là nodejs thì nên xử lý đc vấn đề bất đồng bộ, còn kỹ thuật promise nên dành riêng cho 1 topic


Log in to reply