Zeta.js의 공장 방법

5627 단어 node.jszeta.js

전언


Zeta.js는node를 위한 경량급 백엔드 프레임워크로 많은angular 개념을 도입하여express와 다른 차원의 방식으로 백엔드 코드를 작성할 수 있습니다.Zeta의 중국어 문서입니다.
Source On GitHub
Website For Zeta

개관


어느 정도 공장은 Provider와 비슷한 작업을 완성했지만 후자로 구분되는 것은 모든 새로운 요청 공장에 같은 대상을 공유하는 것이 아니라 새로운 대상을 제공하는 것이다.또한 공장도 대상 자체가 아니라 대상을 되돌려주는 함수여야 한다.많은 상황하에서, 너는 이 두 가지 임무를 마음대로 선택하여 완성할 수 있지만, 확실히 공장을 도입하는 것이 더욱 편리하고 합리적일 수도 있다.

개시하다


플랜트 정의


Provider와 마찬가지로 공장은 모듈에 등록되어 있는데 예를 들면 다음과 같다.
jsdemo.factory('$sayhi',function(){
    return {content:'hi,world'};
});
//demo is a module

현재, 당신은 $sayhi라는 값이 'Hi, World' 인 속성 콘텐츠의 대상을 가진 공장으로 되돌아왔습니다. 자모 '$' 는 필요하지 않지만, 공장을 일반적인 변수와 구분하기 위해 선택한 공장 이름의 첫머리에 놓는 것을 추천합니다.
공장은 함수를 포함해서 네가 원하는 모든 것을 되돌려 줄 수 있다.
jsdemo.factory('$plus',function(){
    return function(a,b){
        return a+b;
    };
});

그리고 함수 매개 변수 목록에 추가하기만 하면 공장에서 $scope를 사용할 수 있습니다.$scope에 대한 자세한 내용은 다음 장에서 보실 수 있습니다.

사용 공장


Provider와 같이 공장도 요청 처리 함수에 사용되도록 설계되었다.
js//$plus is defined in the example before
demo.get('/',function($scope,$plus){
    $scope.send($plus(1,2).toString()).end();
});
//the client will get '3'

우리가 사용하는 $plus 함수는 정의된 공장 자체가 아니라 공장이 되돌아오는 대상이며, 공장 이름을 요청 처리 함수의 매개 변수 목록에 추가하는 것을 잊지 마십시오.

추출장


Provider처럼 이미 정의된 공장도 찾을 수 있습니다.
jsvar plus=demo.factory('$plus')();
console.log(plus(1,2));
//3 will be got
var dus=demo.factory('$wel');
dus==undefined//true

간단한 예


다음은 당신이 읽은 이해할 수 없는 부분을 관례대로 소홀히 하는 약간 복잡한 예입니다.
js//main.js file
var zeta=require('zeta');
var demo=zeta.module('demo',['demoFactory']);
demo.load();
demo.get('/',function($scope,$plus){
   $scope.send($plus(1,2).toString());
});
js//Factory.js
var zeta=require('zeta');
var demoFactory=zeta.module('demoFactory',[]);
demoFactory.provider('$plus',function(){
    return function(a,b){return a+b;};
});

공장의 계승도 모듈의 의존 주입으로 이루어졌다.

공장 승급


출하 시 Provider 사용


Provider를 사용하는 것은 어렵지 않습니다. 정의된 공장 함수의 매개 변수 목록에 Provider의 이름을 추가하면 됩니다.
jsdemo.provider('$wel',{
    a:1,
    b:2,
    c:3
});
demo.factory('$sum',function($wel){
    var sum=0;
    for(var i in $wel){sum+=$wel[i];}
    return sum;
});

공장 사용 공장


위와 비슷하니 예를 들어 설명하자.
jsdemo.factory('$wel',function(){
    return {
        a:1,
        b:2
    };
});
demo.factory('$sum',function($wel){
    return function(){
        var tmp=$wel();
        return tmp.a+tmp.b;
    };
});

공장의 의미


이미 Provider가 생겼으니 왜 공장의 개념을 도입해야 하는지 물어볼 수도 있다.우선 우리는 표 제출을 처리하는 두 가지 실현 방식을 고려할 것이다.
js//Use Provider
var formidable=require('formidable');
demo.provider('$form',formidable);
demo.post('/upload',function($scope,$form){
    var tmp=new $form.IncomingForm();
    tmp.on('file',function(file){...});
});
js//Use Factory
var formidable=require('formidable');
demo.factory('$form',function(){
    return new formidable.IncomingForm();
});
demo.post('/upload',function($scope,$form){
    $form.on('file',function(file){...});
});

위의 예를 통해 당신은 양자 간의 차이를 잘 알고 있을 것입니다. 위의 서비스는 두 가지 방식에 대해 편애를 보이지 않지만 쿠키를 처리하는 상황을 고려해 보겠습니다.만약에 우리가 하나의 대상으로 모든 요청에 첨부된 쿠키를 표시하려면 매번 요청한 쿠키가 일치하지 않기 때문에parse의 과정을handler에 남기는 것은 분명히 아름답지 않다. 공장이 생기면 걱정할 필요가 없다.
jsdemo.factory('$cookie',function($scope){
    var cook={};
    cook._val=parse($scope.req.headers['cookie']);
    cook._option={};
    cook.getValue=function(name,optName){...};
    cook.setCookie=function(obj){..};
    ...
});

쿠키와 같은 매번 요청에 새로운 대상이 필요한 경우 공장은 더욱 현명한 선택임을 알 수 있다.

주의 사항

  • 플랜트는 재정의하여 무시할 수 있습니다.
  • jsdemo.factory('$compute',function(){
        return function(a,b){return a+b;};
    });
    demo.factory('$compute')()(1,2)==3//true
    demo.factory('$compute',function(){
        return function(a,b){return b-a;};
    });
    demo.factory('$compute')()(1,2)==1//true
    
  • 처리 함수를 요청하는 매개 변수 목록에 공장 이름을 추가하는 것을 잊지 마세요.
  • 공장은 함수여야 하며 그 매개 변수는 의존하는 것을 포함할 수 있다.그리고 요청 처리 함수에 사용되는 것은 공장에서 되돌아오는 것이지 그 자체가 아니다.
  • 같은 요청의 여러 처리 함수와 같은 공장에서 되돌아오는 대상을 공유
  • jsdemo.factory('$count',function(){
        return {num:0};
    });
    demo.handler('h0',function($scope,$count){
        $count.num++;
        $scope.go('next');
    });
    demo.handler('h1',function($scope,$count){
        $scope.send($count.num.toString()).end();
    });
    demo.get('/',['h0','h1']);
    //the client will get 1 instead of 0
    
  • 새로운 요청 공장마다 새로운 대상으로 되돌아오기
  • jsdemo.factory('$count',function(){
        return {num:0};
    });
    demo.get('/',function($scope,$count){
        $scope.send($count.num.toString());
        $count.num++;
        $scope.end();
    });
    //the client will get 0 every time requesting path '/'
    

    좋은 웹페이지 즐겨찾기