如何在回调中使用yield put()动作来保存其数据?

时间:2017-01-09 23:20:52

标签: react-native in-app-purchase redux-saga

我在我的商店使用redux-saga,https://github.com/chirag04/react-native-in-app-utils加载我的Apple应用内购买产品。

要检索的格式为:

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

}

如何将产品保存到我的商店?

修改 我能够通过将它包装在Promise中来实现它。

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);
        });
    });
}

我不确定我是否正在进行错误处理。

1 个答案:

答案 0 :(得分:0)

等待InAppUtils.loadProducts。您可以使用yield来执行此操作。

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(...);
});


我建议阅读有关生成器主题的更多内容 - 它会让您的生活更轻松,代码更容易阅读;)