0

在使用ReduxRedux-Saga的 ECMA-2015-App(具体:React Native)中,我们经常大量使用这样的代码(工作正常,这里不是真正的问题):

const stats = yield call([dataStorage, dataStorage.loadPrefetchingStats], languageId);

yield put({type: ACTIONS.R_SYNCHRONIZE_STATE_PROGRESS, payload: {max: statsUnfetched, value: statsFetched}});

try {
  yield importRecord(languageId, record, dataStorage)
}
catch(err) {
  console.log("ERROR: ", err)
  yield put({type: ACTIONS.R_SYNCHRONIZE_STATE_ERROR, payload: err});
  return false;
}

这里有个简短的问题:但是,是否有可能在回调函数中结合异步函数和 yield-constructs?

更长的问题:

为了在用户设备上使用本地 sqlite-database,我们使用了这个很棒的库react-native-sqlite-storage

为了在一个事务中封装多个 sql 语句,回调是必要的,如下所示:

        this.db.transaction((tx) => {

            var sql = `UPDATE product SET prefetched=?, error_prefetching=0 WHERE id=?`;

            return tx.executeSql(sql, [
                product.prefetched,
                product.id
            ], (tx, results) => {
            }, (a, b) => {
                console.log('ERROR', a,b);
            }) ;

        });

当所有这些语句都封装在一个大的单个事务中时,在许多 INSERT 或 UPDATE 上加速 sqlite 是众所周知的最佳实践。

但是由于我们使用带有大量“yield”语句的 redux 来在业务逻辑和 UI 更新之间进行通信,所以我们现在遇到了问题。

有人在这里有想法吗?

4

1 回答 1

1

没有办法在生成器中处理回调。更好的方法是Promisify你的回调,然后你可以使用yields.

考虑一个如下所示的函数:

function doSomething(data,callback) {
   ...
   ...
   callback();
}

如果你答应它:

function promisedDoSomething(data) {
   return new Promise( (resolve) => {
      doSomething(data, resolve);
   }
}

现在你可以在生成器中使用这个 promisified 函数,并且只需将它与yield.

var response = yield promisifiedDoSomething(data);
于 2016-08-09T13:57:10.507 回答