Mình có một thắc mắc thế này ạ: Tại sao Promise này lại không chạy đúng?



  • mình đang lấy tất cả các phần tử trong redis ra. Đã dùng promise như trên và thấy không sai chỗ nào :D
    Tại sao "lstobjects" sau khi promise.all chạy xong vẫn không có dữ liệu ở then?
    0_1543920102898_Capture.PNG

    Code ở đây http://collabedit.com/a48r4



  • Mình nghĩ bạn chưa hiểu rõ Promise hoặc chưa biết cách dùng promise all, hoặc là bạn quá pro mới viết kiểu gộp lại như thế kia ^^ vì mình thấy cách viết này khá hay...

    Promise all được sử dụng với tham số đầu vào là 1 mảng nhiều promise con. bạn nên viết như dưới đây cho dễ xử lý:
    Ví dụ:
    results là 1 mảng, A là 1 hàm trả về promise với đầu vào giả sử là key của results chẳng hạn
    // code
    let p = []; // mảng để push promise vào để xử lý ở promise all
    result.foreach(key => {
    p.push(A(key)); // A(key): function return promise
    })

    p = Promise.all(p);
    p.then(array_results => {
    // done
    });



  • hi . Thank @Hải-Nguyễn215 .Về nguyên tắc thì mình viết gộp như trên nó cũng là return nhiều promise con. Promise.all nhận nhiều promise con đang pending sẽ xử lý đến khi nào không còn promise pending nữa. Mình thấy không sai chỗ nào hết. Mình cũng đã viết tách ra rồi nhưng cũng không được :D
    để mình thử lại xem sao
    thank bạn nha.



  • 0_1543977476387_image.png
    Đây là lúc đầu mình viết
    Kết quả cũng không được như mong muốn?


  • Global Moderator

    @Nguyễn-Phi said in Mình có một thắc mắc thế này ạ: Tại sao Promise này lại không chạy đúng?:

    Kết quả cũng không được như mong muốn?

    Tại sao bạn không dùng hàm map mà lại dùng filter??

    Bạn thử thay lại xem sao? Mà các bạn hay chụp ảnh gửi lên quá. Nên nhiều lúc muốn viết mã demo mà ngại gõ lại từ ảnh quá. :)

    Ngoài lề, các bạn google học thêm cách sử dụng ngôn ngữ Markdown nhé. Hiện forum đang hỗ trợ chèn code vào bài viết bằng ngôn ngữ này. Chứ chộp ảnh lên thì mình nghĩ các bạn có kinh nghiệm khác chỉ xem cho vui thôi :)

    Gõ lại code của bạn thì như này: :P

    var lstobjects = [];
    client.keys("*", function (err, arrayOfKeys) {
        Promise.all(
            arrayOfKeys.map((key) => {  // Sửa lại, sử dụng hàm `.map`
                return new Promise((resolve, reject) => {
                    client.get(key, function (err, reply) {
                        var object = JSON.parse(reply);
                        if (object.status === status) {
                            lstobjects.push(object);
                        }
                        resolve();
                    });
                });
            })
        ).then(function () {
            console.log('All operations are done');
            console.log(lstobjects.length);//chỗ này không hiểu tại sao lại ra =0?
        }).catch(function (err) {
            console.log(err);
        });
    });
    

  • Global Moderator

    Giải thích thêm là khi sử dụng hàm .filter thì kết quả trả về của hàm này là mảng ban đầu với số lượng phần tử có bị giới hạn hay không (remove or not). Nếu bạn sử dụng hàm .map thì kết quả trả về của hàm này được biến đổi sang kiểu dữ liệu mới, nhưng số lượng các phần tử vẫn được giữ nguyên.

    Trong trường hợp của bạn thì khi sử dụng hàm .map thì kết quả sẽ là 1 mảng các Promise.



  • @Vũ đã thành công rồi :D thank mod nhiều hi. do dùng filter nên nó bị sai



  • @Nguyễn-Phi

    1. bạn viết lại theo cách của mình, dùng foreach đảm bảo chạy.
    2. theo mình thấy thì dùng filter ko dùng được vì nó trả về giá trị của mảng chứ ko phải promise con. nên bạn thử chuyển qua map xem sao

Log in to reply