node.js_node.js에서 when.js의 비동기 프로그래밍 실습

WBOY
풀어 주다: 2016-05-16 16:29:19
원래의
1496명이 탐색했습니다.

비즈니스 시나리오 가정:

RSS 주소를 통해 RSS를 받아 파일에 저장하면 RSS 주소가 파일에 저장됩니다.

이 시나리오의 비즈니스를 완료하려면 다음 3가지 작업을 완료해야 합니다.

1. 파일에서 RSS 주소를 읽어옵니다.

2. RSS를 받으세요.

3. 파일에 저장합니다.

마지막으로 이 세 가지 작업을 통합합니다.

준비:

RSS 주소가 저장되어 있는 파일, address.txt.

http://programmer.csdn.net/rss_programmer.html

작업 1:

RSS 주소 파일의 내용을 읽어 콜백을 통해 반환합니다.

코드 복사 코드는 다음과 같습니다.

var getRssAddress = 함수(경로, 콜백) {
fs.readFile(경로, {인코딩: 'utf8'}, 함수(err, 데이터) {
​ 콜백(err, data);
});
}

미션 2:

RSS 주소를 통해 RSS를 받고 콜백을 통해 오류나 데이터를 반환합니다.

코드 복사 코드는 다음과 같습니다.

var getRss = function(url, 콜백) {
var 데이터 = '';
http.get(url, 함수(res) {
res.on('data', function(chrunk) {
데이터 = chrunk;
});
res.on('end', function() {
​​ 콜백(null, 데이터);
});
}).on('오류', 함수(err) {
​ 콜백(err, null);
});
}

미션 3:

RSS를 파일에 저장하고 콜백을 통해 오류를 반환합니다.

코드 복사 코드는 다음과 같습니다.

var saveRss = 함수(데이터, 콜백) {
fs.writeFile('rss.txt', data, 'utf8', function(err) {
콜백(err);
});
}

통합:

코드 복사 코드는 다음과 같습니다.

getRssAddress('address.txt', function(err, data) {
if(err) {
console.log(err);
반품;
}
getRss(데이터, 함수(err, 데이터) {
If(err) {
console.log(err);
반품;
}
SaveRss(데이터, 함수(err) {
If(err) console.log(err);
});
});
});

위의 코드는 비동기 로직의 반환을 처리하기 위해 가장 일반적인 콜백을 사용하는 완전 비동기 처리입니다. 장점은 누구나 쉽게 받아들일 수 있는 표준 작성 방법이라는 것입니다. 단점은 결합이 너무 강하다는 것입니다. 예외 처리는 번거롭고 코드는 직관적이지 않습니다. 특히 복잡한 비즈니스 로직과 여러 처리 작업을 처리할 때 콜백 계층은 사람들의 눈을 현혹시켜 코드 유지 관리를 어렵게 만들 수 있습니다.

Promise/A 사양 구현 중 하나인 when.js는 이 문제 영역을 겨냥하고 있습니다.

변형된 코드를 살펴보겠습니다.

미션 1:

코드 복사 코드는 다음과 같습니다.

var getRssAddress = 함수(경로) {
var deferred = when.defer();
fs.readFile(경로, {인코딩: 'utf8'}, 함수(err, 데이터) {
If (err) deferred.reject(err);
        deferred.resolve(data);
});

deferred.promise를 반환합니다.
}



미션 2:

코드 복사 코드는 다음과 같습니다.

var getRss = function(url) {
  var deferred = when.defer();
    var 데이터 = '';
    http.get(url, 함수(res) {
      res.on('data', function(chrunk) {
        데이터 = chrunk;
      });
      res.on('end', function() {
        deferred.resolve(데이터);
      });
    }).on('오류', 함수(err) {
      deferred.reject(err);
    });

    deferred.promise를 반환합니다.
}

任务3:

复主代码 代码如下:

var saveRss = 함수(데이터) {
  var deferred = when.defer();
  fs.writeFile('rss.txt', data, 'utf8', function(err) {
    if(err) deferred.reject(err);
    deferred.resolve();
  });

  deferred.promise를 반환합니다.
}


 

합:

复主代码 代码如下:

getRssAddress('address.txt')
  .그러면(getRss)
  .그러면(저장Rss)
  .catch(함수(err) {
    console.log(err);
  });

解释:

약속/A规范결정은 "연기/약속"模型就是 "发布/订阅者"模型,일반적으로Deferred对象发布事件,可以是完成resolve事件,或者是失败reject事件;communicationPromise对象进行对应完成或失败的订阅。

현재 Promises/A规范中 ,每个任务city有三种状态:默认(보류 중)、完成(이행)、失败(거부됨)。

1.默认状态可以单向转移到完成状态,这个过程叫resolve, 对应的 方法是deferred.resolve(promiseOrValue);

2.默认状态还可以单向转移到失败状态,这个过程叫reject , 对应的 方法是deferred.reject (이유);

3.默认状态时, 还可以过deferred.notify(update)来宣告任务执行信息,如执行进titude;

4.현재 보류 중인 차량이 하나뿐이고, 대기 중인 차량이 대기 중입니다.

조명상대형.

일반적으로 when.defer는 deferred로 결정됩니다.

var deferred = when.defer();
异步数据获取成功后,发布一个完成事件。

deferred.resolve(데이터);
异步数据获取失败后,发布一个失败事件。

지연.거부(err);
并且返回Promise对象작성为订阅使사용。

지연된 반환 약속;
订阅是通过약속한 다음 방법을 실행하세요/失败/통지적订阅.

getRssAddress('address.txt')
  .그러면(getRss)
그런 다음에는 3个参数 ,分别是onFulfilled、Rejected、onProgress

promise.then(onFulfilled, onRejected, onProgress)
上一个任务被resolve(data), onFulfilled函数就会被触发, data 作为它的参数.

上一个任务被거부(이유),那么onRejected就会被触发,收到이유。

任何时候,onFulfilled and onRejected증오只有其一可以被触发,并且只触发一次。

对于处理异常,when.js를 也提供了极其方便的방법으로 能传递错误,多个任务串行执行时,我们可以只们可以只에서最后一个乪乪거부됨. 캐치하세요.

如此写法简单明了。

复主代码 代码如下:

getRssAddress('address.txt')
  .그러면(getRss)
  .그러면(저장Rss)
  .catch(함수(err) {
    console.log(err);
  });

약속하세요.仅是基本使사용,when.js提供的功能远远不止本文提到的这些,具体参光官方API。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿