2017-11-01 16 views
0

別の関数でAsyncStorageに格納されている値を使用したいと思います。約束の代わりにAsyncStorage(getItem)のキーの値を返す

は、ここで私はAsyncStorageに保存されているsavedValueの値を取得するために)上記の関数getSavedValueを(作られた私のValueHandler.js

import { AsyncStorage } from 'react-native'; 

export async function getSavedValue() { 
    try { 
    const val = await AsyncStorage.getItem('@MyStore:savedValue'); 
    console.log("#getSavedValue", val); 
    return val; 
    } catch (error) { 
    console.log("#getSavedValue", error); 
    } 
    return null; 
} 

です。

import {getSavedValue} from '../lib/ValueHandler'; 
import Api from '../lib/Api'; 

export function fetchData() { 
    return(dispatch, getState) => { 
    var params = [ 
     'client_id=1234567890', 
    ]; 
    console.log("#getSavedValue()", getSavedValue()); 
    if(getSavedValue() != null) { 
     params = [ 
     ...params, 
     'savedValue='+getSavedValue() 
     ]; 
    } 
    params = params.join('&'); 
    console.log(params); 
    return Api.get(`/posts/5132?${params}`).then(resp => { 
     console.log(resp.posts); 
     dispatch(setFetchedPosts({ post: resp.posts })); 
    }).catch((ex) => { 
     console.log(ex); 
    }); 
    } 
} 

どうすればよいですか?私は、ローカルストレージに値を保存し、APIコールを行う必要があるときに単純に値を取得する単純な方法が本当に必要でした。

誰にでもこれに関する提案や解決策がありますか?

+0

私は問題があると仮定すると答えを掲載している中であなたが待つことができreturn (dispatch, getState) => {asyncを追加しますフェッチ呼び出しは、キー(asyncStorageの保存値)が取得される前に行われます(asyncStorageからの取得は非同期です)。 Plzは質問がうまく説明されていないので、問題が他のものであれば修正してください:) –

+1

非同期関数はプロミスを返します...それはasync/awaitとは約束のための砂糖です...価値を得るために、 getSavedValueを呼び出す関数が 'async'ではないので、古い学校の約束文である' getSavedValue()。then(value =>/*)を宣言します。ここでのみここで値を使う* /) ' –

+0

@ JaromandaX-私はそれを手に入れます。私はthen()の部分でそれを使用する従来の方法を知っています。値として保存して直接アクセスする直接的な方法が必要でした。とにかくありがとう。 –

答えて

0

あなたはこのような何か行うことができます。

import { AsyncStorage } from 'react-native'; 

export async function getSavedValue() { 
    return new Promise ((resolve, reject) => { 
     try { 
     const val = await AsyncStorage.getItem('@MyStore:savedValue'); 
     console.log("#getSavedValue", val); 
     resolve(val); 
     }catch (error) { 
     console.log("#getSavedValue", error); 
     reject(error) 
     } 
    }) 
} 


import {getSavedValue} from '../lib/ValueHandler'; 
import Api from '../lib/Api'; 

export function fetchData() { 
    return async (dispatch, getState) => { 
    var params = [ 
     'client_id=1234567890', 
    ]; 
    console.log("#getSavedValue()", getSavedValue()); 
    if(getSavedValue() != null) { 
     params = [ 
     ...params, 
     'savedValue='+ await getSavedValue() 
     ]; 
    } 
    params = params.join('&'); 
    console.log(params); 
    return Api.get(`/posts/5132?${params}`).then(resp => { 
     console.log(resp.posts); 
     dispatch(setFetchedPosts({ post: resp.posts })); 
    }).catch((ex) => { 
     console.log(ex); 
    }); 
    } 
} 
+0

動作しません。 –

+0

'fetchData'に' async'を追加すると、 'fetchData'がプロミスを返し、内部でasyncを使用することができるようになりました。エラーがクラッシュしました。" WorkerGlobalScope "で 'importScripts'を実行できませんでした。 'fetchData'を呼び出すことによって返された関数に' await'が追加されました...おそらく 'return async(dispatch、getState)=> {'助けてもらえます –

+0

ええ、 –

0

これを試してみてください:

はそれが

import {getSavedValue} from '../lib/ValueHandler'; 
import Api from '../lib/Api'; 

export function fetchData() { 
    return async (dispatch, getState) => { 
     let params = [ 
      'client_id=1234567890', 
     ]; 
     const val = await getSavedValue(); 
     if (val != null) { 
      params = [...params, 'savedValue='+val]; 
    // why not 
    //  params.push(`savedValue=${val}`); 
    // 
     } 
     params = params.join('&'); 
     return Api.get(`/posts/5132?${params}`)) 
     .then(resp => { 
       dispatch(setFetchedPosts({ post: resp.posts })); 
     }) 
     .catch((ex) => { 
      console.log(ex); 
     }); 
    }; 
} 
関連する問題