Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
React native 在Redux';s操作,使用回调调用函数(使用带有React本机联系人的async/await)_React Native_Redux_Redux Thunk_React Native Contacts - Fatal编程技术网

React native 在Redux';s操作,使用回调调用函数(使用带有React本机联系人的async/await)

React native 在Redux';s操作,使用回调调用函数(使用带有React本机联系人的async/await),react-native,redux,redux-thunk,react-native-contacts,React Native,Redux,Redux Thunk,React Native Contacts,我正在开发一个移动应用程序,它使用React-Native、Redux和React-Native联系人 在action creator中,我尝试调用一个函数(从React Native Contacts),该函数具有回调(而不是承诺)。下面是我的代码 我希望操作“acContactImport”在继续执行“dispatch”语句之前,等待助手函数“fContactImport”完成。它不等待它。我怎样才能让它等待呢 // Action Creator: import Contacts from

我正在开发一个移动应用程序,它使用React-Native、Redux和React-Native联系人

在action creator中,我尝试调用一个函数(从React Native Contacts),该函数具有回调(而不是承诺)。下面是我的代码

我希望操作“acContactImport”在继续执行“dispatch”语句之前,等待助手函数“fContactImport”完成。它不等待它。我怎样才能让它等待呢

// Action Creator: 
import Contacts from 'react-native-contacts';
import { PermissionsAndroid } from 'react-native'; 

export const acContactImport = (userID) => {
    return async (dispatch) => {
      let contactList = [];
      try {
          // The following statement should be executed asynchronously. 
          // However, it is not. How can I make it asynchronous? 
          contactList = await fContactImport();

          dispatch({
            type: CONTACT_IMPORT,
            payload: { contactList: contactList },

          });
      } 
      catch (err) {
        console.log("acContactImport - catch: ", err);
      }
    }; 
}; 

// Helper Function 1
export const fContactImport = async () => {
  let contactList = [];
    if (Platform.OS === "android") {
        PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.READ_CONTACTS, {
            title: "Contacts",
            message: "This app would like to view your contacts."
        })
        .then(() => {
            contactList = _loadContacts();
        });
    } else {
        contactList = _loadContacts();
    } 
}

// Helper Function 2
export const _loadContacts = () => {
    Contacts.getAll((err, data2) => {
      if (err) {
        return []; 
      }
      else {
        let candidates = [];
        for (let i = 0; i < data2.length; i++) {
            let candidateObject = { name: candidateRecord.givenName + " " + candidateRecord.middleName + " " + candidateRecord.familyName };
            candidates.push(candidateObject);
        }
        return contactList; 
      }
  });
}
//操作创建者:
从“react native Contacts”导入联系人;
从“react native”导入{PermissionsAndroid};
导出常量acContactImport=(用户ID)=>{
返回异步(调度)=>{
让contactList=[];
试一试{
//应异步执行以下语句。
//但是,它不是。如何使它异步?
contactList=等待fContactImport();
派遣({
类型:联系您导入,
有效负载:{contactList:contactList},
});
} 
捕捉(错误){
log(“acContactImport-catch:,err”);
}
}; 
}; 
//辅助功能1
export const fContactImport=async()=>{
让contactList=[];
如果(Platform.OS==“android”){
PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.READ_CONTACTS{
标题:“联系人”,
消息:“此应用程序希望查看您的联系人。”
})
.然后(()=>{
联系人列表=_loadContacts();
});
}否则{
联系人列表=_loadContacts();
} 
}
//辅助功能2
导出常量加载联系人=()=>{
Contacts.getAll((错误,数据2)=>{
如果(错误){
返回[];
}
否则{
让候选人=[];
for(设i=0;i
显然,问题不在action creator中,而在helper函数中,它不支持新样式的承诺(异步/等待)。所以,这里是解决方案

// Action Creator: 
// No changes are required. Original code is good. 

// Helper Function 1
export const fContactImport = async () => {
  let contactList = [];
  if (Platform.OS === "android") {
    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.READ_CONTACTS,
        {
            title: "Contacts",
            message: "This app would like to view your contacts."
        },
      );

      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        contactList = await _loadContacts();
      } else {
        console.log('Contacts access denied');
      } 

    } catch (err) {
      console.warn(err);
    } 
  } else {
    contactList = await _loadContacts();
  }
  return contactList;
}

// Helper Function 2
export const _loadContacts = () => {
  return new Promise((resolve, reject) => {
    Contacts.getAll((err, data2) => {
      if (err) {
        reject([]);
      }
      else {
        let candidates = [];
        for (let i = 0; i < data2.length; i++) {
            let candidateObject = { name: candidateRecord.givenName + " " + candidateRecord.middleName + " " + candidateRecord.familyName };
            candidates.push(candidateObject);
        } 
        resolve(candidates);
      }
    });
  });
}
//操作创建者:
//不需要更改。原始代码很好。
//辅助功能1
export const fContactImport=async()=>{
让contactList=[];
如果(Platform.OS==“android”){
试一试{
授予的常数=等待许可和ROID.request(
PERMISSIONS和roid.PERMISSIONS.READ_联系人,
{
标题:“联系人”,
消息:“此应用程序希望查看您的联系人。”
},
);
如果(已授予===权限sandroid.RESULTS.已授予){
联系人列表=等待_loadContacts();
}否则{
log(“联系人访问被拒绝”);
} 
}捕捉(错误){
控制台。警告(错误);
} 
}否则{
联系人列表=等待_loadContacts();
}
返回联系人列表;
}
//辅助功能2
导出常量加载联系人=()=>{
返回新承诺((解决、拒绝)=>{
Contacts.getAll((错误,数据2)=>{
如果(错误){
拒绝([]);
}
否则{
让候选人=[];
for(设i=0;i