2016-08-03 5 views
0

:ECMA 2015 : 콜백 루틴에서 "yield"와 함께 비동기 함수를 사용하는 방법은 무엇입니까? ECMA-2015 응용 프로그램 (콘크리트 : 기본 반응)에서

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

짧은 ReduxRedux-Saga를 사용하여 우리는 지속적으로 거대한 (잘 작동하고 여기에 정말 문제가되지 않습니다) 같은 코드의 사용을 그러나 여기에 질문 : 콜백 함수 내에 비동기 함수와 yield 구조를 결합 할 수있는 가능성은 있습니까?

더 이상 질문 :

우리는이 환상적인 라이브러리 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들 또는 업데이트를 sqlite가 속도를 높이기 위해 모든 문이 캡슐화 할 때 대규모 단일 거래 내에서

하지만 비즈니스 로직과 UI 업데이트 사이에서 통신하기 위해 "수익률"이 많은 redux를 사용하고 있으므로 문제가 발생합니다.

누군가에게 아이디어가 있습니까?

+0

* "하지만 유감 스럽지만 콜백 기능에 사용하기위한 것이 아닙니다."*이 방법은 올바르지 않습니다. 'yield'는 발전기에서만 사용될 수 있습니다. 따라서 콜백 함수가 생성기 인 경우이를 사용할 수 있습니다. 귀하의 질문은 오히려 redux-saga와 콜백을 사용하여 "전통적인"비동기 함수를 통합하는 방법입니다. –

+0

나는 Felix Kling이 말한 것과 똑같은 생각을하고있었습니다. AFAIK, yield는 제너레이터 함수 내에서 사용됩니다. 당신은 또한 async/await 시도 할 수 있습니다 –

+0

나는 당신이 얼마나 깊이 중첩되었는지에 관계없이 redux-saga의 채널을 만들고 콜백에서 생각할 수 있다고 생각합니다.이 채널 (또는 다른 채널)에 메시지를 넣을 수 있습니다. 채널로부터). 그런 다음 무용담을 취할 때와 마찬가지로이 채널에서 메시지를 얻을 수 있습니다. –

답변

0

발전기에서 콜백을 처리 할 방법이 없습니다. 더 좋은 방법은 Promisify 콜백이고 다음에 yields을 사용하여 약속을 처리 할 수 ​​있습니다. 당신이 그것을 promisify 경우

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

:

은 다음과 같습니다 기능을 고려
function promisedDoSomething(data) { 
    return new Promise((resolve) => { 
     doSomething(data, resolve); 
    } 
} 

지금 당신이 발전기이 promisified 기능을 사용할 수 있습니다 그냥 yield 함께 사용.

var response = yield promisifiedDoSomething(data);