2017-12-11 30 views
5

verifyUser mà đang chờ verifyUserSignInSuccess mà đang chờ userSnapshot mà đang chờ userTrong ReactNative, phương pháp Async Await nào tốt hơn trong hai phương pháp này và tại sao?

đây trong hai chức năng, trong đó sẽ có hiệu quả hơn về tính chính xác, bộ nhớ, thời gian cho ứng dụng ReactNative:

export function verifyUser() { 
    return async dispatch => { 
    dispatch(verifyUserSignInRequest()); 
    try { 
     const user = await firebase.auth().onAuthStateChanged(); 

     if (user) { 
      let userRef = "/user/" + user.uid; 
      const userSnapshot = await firebase 
      .database() 
      .ref(userRef) 
      .once("value"); 
      dispatch(verifyUserSignInSuccess(userSnapshot.val())); 
     } else { 
      dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN)); 
     } 
    } catch (e) { 
     dispatch(verifyUserSignInFailure(e.message)); 
    } 
    }; 
} 

Hoặc Nested Async Đang chờ:

export function verifyUser() { 
    return async dispatch => { 
    dispatch(verifyUserSignInRequest()); 
    try { 
     await firebase.auth().onAuthStateChanged(async user => { 
     if (user) { 
      let userRef = "/user/" + user.uid; 
      await firebase 
      .database() 
      .ref(userRef) 
      .once("value") 
      .then(() => { 
       dispatch(verifyUserSignInSuccess(userSnapshot.val())); 
      }); 
     } else { 
      dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN)); 
     } 
     }); 
    } catch (e) { 
     dispatch(verifyUserSignInFailure(e.message)); 
    } 
    }; 
} 
+0

Tôi nghĩ tùy chọn đầu tiên tốt hơn, vì dễ đọc hơn. Tôi sẽ không sử dụng async/await, nhưng Promise thay thế. Thứ hai là sự pha trộn của lời hứa không đồng bộ/chờ đợi khiến cho việc đọc khó hơn một chút. Ý kiến ​​của tôi, tôi sẽ chuỗi Promise để có nó sạch sẽ và tốt đẹp :) – parohy

+0

Đầu tiên là dễ đọc hơn, outdent khối 'if (user)/else'. – Damon

Trả lời

2

Theo documentation, các onAuthStateChanged() hàm trả

Chức năng hủy đăng ký cho người quan sát.

Vì vậy, bạn có thể chỉ:

var unsubscribe = firebase.auth().onAuthStateChanged((user) { 
    // handle it for changes signed in, signed out, or when the user's ID token changed in situations such as token expiry or password change 
}); 

Và sau đó:

unsubscribe(); cho đăng ký cho người quan sát.

onAuthStateChanged là người quan sát gọi người quan sát khi người dùng đăng nhập, đăng xuất hoặc khi mã thông báo ID của người dùng thay đổi trong các tình huống như hết hạn mã thông báo hoặc thay đổi mật khẩu. vì vậy giải pháp thứ hai là giải pháp tốt nhất. mọi thông tin đăng nhập hoặc thay đổi.

` let userRef = "/user/" + user.uid; 
      await firebase 
      .database() 
      .ref(userRef) 
      .once("value") 
      .then(() => { 
       dispatch(verifyUserSignInSuccess(userSnapshot.val())); 
      }); 
     } else { 
      dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN)); 
     }` 

chính xác để kiểm tra chéo là người dùng hợp lệ hay không. Tôi không nghĩ cần so sánh bộ nhớ.

2

Thời gian - Vì tất cả các chức năng không đồng bộ của bạn cần chạy sau phương pháp khác sử dụng async/await hoặc promise chain hoặc hỗn hợp cả hai sẽ chỉ mất một thời gian.

Chính xác - Cả hai đều chính xác về mặt logic và sẽ hoạt động tương tự. Nhưng async/await là phần bổ sung mới nhất cho JS để giải quyết vấn đề chuỗi lời hứa. Lời hứa chaining lá khó đọc. Tốt hơn U dính vào async/await.For tình huống mà u cần phải chạy hai chức năng async parallelly, sử dụng await Promise.all() vv Cuối cùng, đó là sở thích cá nhân của bạn.

Bộ nhớ? - Tôi không có ý tưởng về điều đó

đã đọc cuốn sách này miễn phí trên github, trong đó có chi tiết về những lời hứa, chức năng async, async/chờ đợi, vv https://github.com/getify/You-Dont-Know-JS

Các vấn đề liên quan