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
Tại sao "lstobjects" sau khi promise.all chạy xong vẫn không có dữ liệu ở then?
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
để mình thử lại xem sao
thank bạn nha.
-
Đây là lúc đầu mình viết
Kết quả cũng không được như mong muốn?
-
@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ùngfilter
??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ôiGõ lại code của bạn thì như này:
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); }); });
-
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ácPromise
.
-
@Vũ đã thành công rồi
thank mod nhiều hi. do dùng filter nên nó bị sai
-
- bạn viết lại theo cách của mình, dùng foreach đảm bảo chạy.
- 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