Promise trong function ?



  • Cho mình hỏi ngu tí: Trong function A gọi một promise-function B (tức function B trả về một promise) thì function A cũng phải trả về promise luôn phải không?
    Ví dụ:
    Nếu function không trả về promise, như cách viết dưới đây được hay không:

    //Type 1
    function A(param1, param2){     
    	var result_of_A = {}; 
    	B(param1, param2).then(function(result_of_B) {               
    		result_of_A = result_of_B;
    	})
    	return result_of_A; //Không đúng lắm ?!!
    }
    //....
    var rs = function A('abc', '123');
    console.log(rs);
    

    Hay phải bắt buộc viết và dùng thế này

    //Type 2
    function A(param1, param2){     
    	return new Promise(function(rs, rj){ 
    		B(param1, param2).then(function(result_of_B) {               
    			rs(result_of_B); 
    		});
    	})
    }
    //....
    A('abc', '123').then(function(result_of_A){
        console.log(result_of_A);
    })
    

    Trong trường hợp mình muốn dùng như Type 1 ở trên thì phải sửa lại hàm A như thế nào? Mong các bạn chỉ giáo thêm. Thank all



    • Đầu tiên thì, A trả về gì đó là do bạn lập trình.
    • Nhìn Type 1 của bạn thì thấy bạn chưa nắm chắc đc về Async lắm.
    • var rs = function A('abc', '123'); : có xử lý Async mà gán như này thì không đúng, Async thì cần dùng Callback, Promise ( có thêm async - await, nhưng mình nghĩ bạn nên nắm 2 cái kia trước )
    • Type2 thì có vẻ đúng hơn, nhưng như trên thì sao k dùng B luôn cho rồi.
    • Và nhớ phải handle error, ( rj )


  • Ý mình chính là chỗ:
    "có xử lý Async mà gán như này thì không đúng ..."
    tức là "có xử lý Async mà vẫn muốn gán như vậy thì phải làm sao, làm sao để lấy luôn giá trị kết quả mà không cần trả về promise ??



  • @phatht: theo mình biết thì JS không xử lý như vậy, muốn có syntax tương tự thì bạn phải nghiên cứu thêm về Async, await, nhưng bản chất nó sẽ sử dụng Promise.


  • Espresso

    Bạn thử này xem:
    //Type 1
    function A(param1, param2){
    return B(param1, param2).then(function(result_of_B) {
    return result_of_B;
    })
    }
    //....
    var rs = function A('abc', '123');
    console.log(rs);



  • @hoocat said in Promise trong function ?:

    Bạn thử này xem:
    //Type 1
    function A(param1, param2){
    return B(param1, param2).then(function(result_of_B) {
    return result_of_B;
    })
    }
    //....
    var rs = function A('abc', '123');
    console.log(rs);

    Bạn thử chưa ?, trong thế giới code nói chung, javascript nói riêng, có nhiều cái mình tưởng vậy mà nó không phải vậy đâu, nó ...huyền bí diệu lắm bạn.


  • Espresso

    He he, tất nhiên là ko bao giờ chạy ra kết quả như mong muốn rồi, vấn đề ko có gì to tát cả, là do khi run cái chương trình nó ghét func A kia lấy dữ liệu chậm quá nên nó luôn cho thằng console.log(rs) chạy trước, vì vậy có một thanh niên dev nọ loay hoay mãi mà ko tìm ra cách. Cuối cùng anh ta đã tạo ra Promise nhằm dừng tạm thời chương trình đang chạy lại để chờ cái anh func A kia lấy dữ liệu về xong xuôi thì mới cho console ra(như Type 2 bạn viết). Tóm lại, Type 1 là nguyên nhân hình thành Promise và Type 2 là ý nghĩa lịch sử của nó.



  • @hoocat :

    • Bạn có chắc fund B: "luôn cho thằng console.log(rs) chạy trước" ?
    • "Dừng tạm thời chương trình đang chạy lại", cái này khó hiểu quá ? Bạn có thể nói thêm 1 tí về "dừng tạm thời" "chương trình" ?

    Cảm ơn.



  • Thật ra vấn đề ban đầu của mình túm gọn lại có thể miêu tả như đoạn code sau:

    funtion f_A(p1,p2){
         var rsOfB = f_B(p1,p2);
         //làm gì tiếp đó......
         // rsOfA = ....;
         //....
         return rsOfA;
    }
    ////////////////////////////////////
    /*.. Ở một thế giới nào đó có triệu hồi f_A...*/
    // .bla bla....
    var rsOfA = f_A(xxx, yyy);
    //...làm gì tiếp đó nữa....
    // .bla bla....
    

    Vấn đề là lúc đầu thằng f_B là thực thi đồng bộ, rồi 1 ai đó đã nâng cấp, giờ f_B trở thành hàm bất đồng bộ (!!!) (mình gọi đơn giản ở trên là nó trả về 1 promise đó).
    Cho nên ý mình là có cách nào để chỉ thay đổi trong f_A thôi mà không phải thay đổi ở bất kì nơi nào khác đã trót gọi f_A ???


Log in to reply