2016-08-03 50 views
0

在ECMA-2015应用内(具体:阵营母语)使用ReduxRedux-Saga我们有这样的代码不断庞大的使用量(工作正常,这里是不是真正的问题):ECMA 2015:如何在回调例程中使用带有“yield”的异步函数?

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的任何可能性?

较长的问题:

要与我们使用这个梦幻般的图书馆react-native-sqlite-storage用户设备上的本地SQLite数据库工作。

要在事务内封装多个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的时候被封装所有这些语句在一个大的单一交易中。

但是由于我们正在使用Reduce和许多“yield”语句在业务逻辑和UI-Updates之间进行通信,现在我们遇到了一个问题。

有人在这里有一个想法吗?

+0

*“但不幸的是,它不能用于回调函数。”*这是不正确的。 'yield'只能用于发电机。所以如果回调函数是一个生成器,你可以使用它。看来你的问题是如何将使用回调的“传统”异步函数与redux-saga结合起来。 –

+0

我在想Felix Kling说的同样的东西。 AFAIK,产量用于发电机功能。你也可以尝试异步/等待 –

+0

我认为你可以创建REDX-SAIG的频道,并且在你的回调中,不管它们的嵌套程度如何,你都可以将消息放入这个频道(或者不同的频道,因为没有匹配功能来自频道)。然后在你的传奇故事中,你可以从这个频道收到信息,就像你采取重做行动一样。传统回调方法中也不允许“等待” –

回答

0

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

考虑的功能,看起来像这样:

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

如果你promisify它:

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

现在你可以在发电机使用promisified功能,只是使用它与yield

var response = yield promisifiedDoSomething(data);