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

ここで短い質問: コールバック関数内で async 関数と 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);
   }
}

これで、この約束された関数をジェネレーターで使用し、yield.

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