2017-01-09 6 views
0

Я использую редукционную сагу для своего магазина и https://github.com/chirag04/react-native-in-app-utils для загрузки своих продуктов для покупок в Apple.Как использовать действие yield put() в обратном вызове для сохранения его данных?

Формат для извлечения является:

var products = [ 
    'com.xyz.abc', 
]; 
InAppUtils.loadProducts(products, (error, products) => { 
    //update store here. 
}); 

я не могу использовать обычный выход put(actions.saveMethod(data)), поскольку он не является генератором.

У меня есть этот код в подписной саге, которая выглядит следующим образом:

export function* iosSubscriptionSaga() { 
    let resp = yield validateUserReceipt(); 

    let respProducts = call(InAppUtils.loadProducts, products); 

    put(IapActions.loadSubscriptionProduct(products[0])) //doesn't work 

} 

Как сохранить продукты в мой магазин?

EDIT: Я смог заставить его работать, обернув его в обещание.

export function* iosSubscriptionSaga() { 
    // validate subscription receipt here 

    let productsResp = yield loadProducts(); 
    if (productsResp) { 
     yield put(IapActions.loadSubscriptionProduct(productsResp[0])); 
     yield put(IapActions.loadSubscriptionsSuccess()); 
    } else { 
     yield put(IapActions.loadSubscriptionsFailure('Error: Failed to load products from iTunes Connect.')) 
    } 
} 

function loadProducts() { 
    return new Promise((resolve, reject) => { 
     InAppUtils.loadProducts(products, (error, products) => { 
      if (!error) { 
       resolve(products); 
      } else reject(error); 
     }); 
    }); 
} 

Я не уверен, что я все же исправляю ошибки.

+0

Что ошибка? – Andreyco

+0

Нет сообщения об ошибке. Но правильный способ использовать 'put()' - с 'yield', иначе он не будет выполняться. Когда я помещаю 'yield', он кричит синтаксическую ошибку, потому что она не находится внутри функции генератора. – Anney

ответ

0

Просто ждите InAppUtils.loadProducts. Вы можете использовать выход для этого.

export function* iosSubscriptionSaga() { 
    try { 
     let resp = yield validateUserReceipt(); 
     let respProducts = yield call(InAppUtils.loadProducts, products); 
     yield put(IapActions.loadSubscriptionProduct(products[0])) 
    } catch (e) { 
     yield put(IapActions.loadSubscriptionsFailure('Error: Failed to load products from iTunes Connect.')) 
    } 
} 

yield Чтобы использовать ключевое слово в loadProducts обратного вызова, перепишем функцию обратного вызова в качестве функции генератора.

InAppUtils.loadProducts(products, function* onComplete(error, products) { 
    yield put(...); 
}); 


Я предлагаю, чтобы прочитать больше на генераторах темы - это сделает вашу жизнь проще и код легче читать;)

+0

'let respProducts = вызов yield (InAppUtils.loadProducts, продукты);' Я уже пробовал это, и он не работал: ошибка ** InAppUtils вызывалась с 1 аргументом, но ожидает 2. ** @Andreyco – Anney