ECMA 2015:如何在回调例程中使用带有“yield”的异步函数?

时间:2016-08-03 14:20:49

标签: javascript sqlite ecmascript-6 ecmascript-5 redux-saga

在使用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数据库,我们使用这个出色的库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更新之间的通信,我们现在遇到了一个问题。

这里有人有想法吗?

1 个答案:

答案 0 :(得分:0)

无法处理生成器中的回调。更好的方法是Promisify您的回调,然后您可以使用yields处理承诺。

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

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

如果你宣传它:

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

现在,您可以在生成器中使用此promisified函数,并将其与yield一起使用。

var response = yield promisifiedDoSomething(data);