Логично ли использовать асинхронное разрешение когда-либо? - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в Обещаниях, поэтому мне интересно, хорошо ли это:

this.someFunc()
  .then(() => {
    alert('loaded')
  });

someFunc() = () => {
  return new Promise(async(resolve) => {
    let obj = await AsyncStorage.getItem('some_val');

    //do stuff with obj

    resolve('yay, everything's done');
  });
};

Или я всегда ВСЕГДА должен использовать then с такими обещаниями, как

return new Promise((resolve) => {
   AsyncStorage.getItem('some_val')
   .then((obj) => {
      // do stuff with obj
      resolve('yay')
   });

? Это как первый подход против паттерна? Это неправильно"? И почему?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Я просто реорганизовал ваши коды, удалив ненужные вещи.

someFunc() = async () => { 
// when you declare arrow function, it should not have () with its name
// put async before arguments to enable await in the code block below 

 return new Promise(async(resolve) => { 
 // you don't need this line because of async and await
 // await returns data wrapped by Promise 
 // as soon as this Promise is resolved or rejected 

   let obj = await AsyncStorage.getItem('some_val'); 
   // 'await' will return the item that is wrapped by Promise. 
   // So, you can access the item(the returned data) in this code block. 
   // but if you want this 'someFunc' to return 'obj'

   //do stuff with obj

   resolve("yay, everything's done");
   // you don't need this line because 'await' will take care of
   // 'AsyncStorage.getItem('some_val')'
 });
};

После рефакторинга у вас будет код, подобный приведенному ниже.

someFunc = async () => { 
  // One of the benefit of async and await is that you can use try/catch block.
  // So, you can easily console out error without by chaining multiple '.catch' after 
  // every '.then'.
  try{
    let obj = await AsyncStorage.getItem('some_val');
    // 'obj' will be the value of item 'some_val'

    // do stuff with obj 
  } catch(error) {
    console.log(error);
  }
  return obj; //this will return resolved Promise because of await.
};

Если вы хотите использовать этот объект в другомФункция, вы можете сделать что-то вроде ниже.

anotherFunc = async () => {
  try{
    const resolvedObj = await someFunc(); 
    // Since someFunc will return resolved Promise that wraps the data from
    // AsyncStorage, await will assign the data to 'resolvedObj'
    // However, if you return 'resolvedObj', this will be 'Promise {<resolved>: 
    // dataFromAsyncStorage}'

    // do stuff with 'resolvedObj'

  } catch(error) {
    console.log(error);      
  }
}
0 голосов
/ 16 сентября 2018

Добавление ключевого слова async в функцию возвращает значение Promise.

Игнорирование этого обещания и его перенос в другое не имеет смысла.Это сбивает с толку код людей, пытающихся его поддерживать.

Вы можете переписать его как:

someFunc() = async () => {
    let obj = await AsyncStorage.getItem('some_val');

    //do stuff with obj

    return 'yay, everything's done';
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...