복붙노트

[REDIS] 자바 스크립트 디자인 패턴 - 원치 않는 비동기 다루기

REDIS

자바 스크립트 디자인 패턴 - 원치 않는 비동기 다루기

나는 (Node.js를 사용) 이벤트 기반 프로그래밍에 아주 새로운 해요. 내가 다시하고 다시하고 다시에서 오는 유지하는 것이 특정 문제가 있기 때문에 난 그냥 그것에 대해 grokking 아니에요 뭔가, 거기에 있다고 생각합니다.

그것은 당신의 방식으로지고있는 것 같다 때 즉, 그 문제는 동시성에 대해 다루고 있습니다. 디자인 비 차단을하고 콜백 기반의 API를 촉진 타사 라이브러리로 작업 할 때 가장 자주, 내 경우에는, 자체 명단.

예를 들어 : 오른쪽 지금은 mranney의 많이 사용하게 몇 가지 물건 쓰고 있어요 라이브러리 노드를-레디 스. 내 프로그램은 RSS 피드를 긁어와 레디 스에 결과를 챙겨 먹여야한다. 나는 레디 스에 일반적인 전략 믿는 것을 사용하고 있습니다 :

var redis = require("redis");
var client = redis.createClient();

var get_latest_results = function (feedId) {
    client.get('feed:+ feedId + ':latest', function (err, res) {
        var latest_reading_key = res.toString();
        client.hgetall(latest_reading_key, function (err, res) {
            var latest_reading = res;
        });
    });
    // how do I specify a return value for this function?
}

latest_reading하는 것은 함수가 종료에 준비가 완료 될 때까지 정의되지 않기 때문에, 함수가 실패 get_latest_results의 하단에 latest_reading 수익을 배치. 반환 콜백을 의미하며, get_latest_results에 의해 무시되기 때문에 hgetall 호출 내에서 latest_reading 배치 복귀에 실패합니다.

이것은 내가 지속적으로 내 길을 작성하는 것 같다 상황의 종류의 한 예입니다. 어쩌면 내가 더 좋은 모르기 때문에 둥근 구멍에 스퀘어 페그 파운드 것을 시도하고있다. 문제의이 클래스를 해결하는 비 hackish 방법이있을 것을 보인다.

해결법

  1. ==============================

    1.당신은 여전히 ​​동기 패러다임에 함수를 작성하기 때문에 당신은 비동기로 어려움을 겪고있다.

    당신은 여전히 ​​동기 패러다임에 함수를 작성하기 때문에 당신은 비동기로 어려움을 겪고있다.

    비동기에서는 이벤트에 콜백을 첨부해야한다. 당신은 get_latest_results ()와 같은 비동기 함수에서 결과를 기대하지해야하지만, 결과가 준비가되면 인수를 호출 할대로 콜백 함수를 전달해야합니다. 콜백은 결과와 함께 할 필요가 무엇이든 할 것입니다 :

    var get_latest_results = function (feedId, readyCallback) {
        client.get('feed:' + feedId + ':latest', function (err, res) {
            var latest_reading_key = res.toString();
            client.hgetall(latest_reading_key, function (err, res) {
                readyCallback(res);                           //--- Trigger Callback
            });
        });
        // how do I specify a return value for this function? //--- You don't
    }
    

    그럼 당신은이 같은 함수를 호출 할 수 있습니다 :

    get_latest_results(1000, function (result) {
       //--- Do whatever needs to be done with the latest result...
    });
    
  2. from https://stackoverflow.com/questions/3919075/javascript-design-patterns-dealing-with-unwanted-asynchrony by cc-by-sa and MIT license