React Native — Async/Await для класса не работает должным образом

Вот мой код...

'use strict';
var React = require('react-native');
var {
  AsyncStorage
} = React;



exports.buildUrl = function(){
  var test = new Sales();
  test.getOrder();
}

class queryBuilder{

  constructor() {

  }

  getUrl(){
    AsyncStorage.getItem('auth').then((value) => {
      var auth = JSON.parse(value);
      var store = auth.url;
      console.log('store = ' + store);
      return store;
    });
  }

}

class Sales extends queryBuilder{

  async getOrder(){
    console.log('get order hit');
    try{
        var urlstart =  await this.getUrl();
    } catch(e) {
      console.log('ERROR')
      console.log(e);
    }
    console.log('URL BELOW');
    console.log(urlstart);
    console.log('URL ABOVE');
  }

}

В моем методе getOrder я надеялся, что urlstart не будет undefined, потому что я использовал await.

Метод console.log внутри getUrl() — это последнее, что возвращается в моей консоли.

Может быть, это ощущение субботы, любая помощь очень ценится!


person Matt The Ninja    schedule 07.05.2016    source источник
comment
Почему бы не сделать это простым async getUrl() { return JSON.parse(await AsyncStorage.getItem('auth')).url; }?   -  person Bergi    schedule 08.05.2016


Ответы (1)


Решил это сам. Async Await требуют возврата обещания для функции, которую я вызываю. Я изменил метод getUrl(), как показано ниже.

  getUrl(){
    return new Promise(function(resolve, reject) {
      AsyncStorage.getItem('auth').then((value) => {
        var auth = JSON.parse(value);
        var store = auth.url;
        console.log('store = ' + store);
        resolve(store);
      });
    }

Любые дальнейшие предложения по-прежнему приветствуются.

Обновлено лучше, Спасибо Юрию

getUrl(){ return AsyncStorage.getItem('auth').then(value => JSON.parse(value).url) }
person Matt The Ninja    schedule 07.05.2016
comment
getUrl(){ return AsyncStorage.getItem('auth').then(value => JSON.parse(value).url) } должно хватить - person Yury Tarabanko; 07.05.2016
comment
Покажите только, что function просто нужно вернуть, у меня просто была неправильная область видимости? - person Matt The Ninja; 07.05.2016
comment
Поскольку у вас уже есть промис, вам не нужно создавать его вручную. Достаточно простого возврата. - person Yury Tarabanko; 07.05.2016
comment
Пожалуйста, обновите свой ответ, использование new Promise в этом случае является антипаттерном. - person loganfsmyth; 07.05.2016
comment
Избегайте антишаблона Promise конструктора! - person Bergi; 08.05.2016
comment
Что вы имеете в виду против шаблона? Обещание обещанием? - person Matt The Ninja; 08.05.2016
comment
Вы должны сделать return AsyncStorage.getItem('auth').then((value) => { ... return store;});. Не создавайте новое обещание, если оно у вас уже есть. - person Felix Kling; 08.05.2016