IT

Node.js에 대한 자연스러운 함수 작성 방법

lottoking 2020. 7. 28. 07:40
반응형

Node.js에 대한 자연스러운 함수 작성 방법


어떤 함수를 정확히 작성하는 방법에 대해 연구했습니다. 많은 문서를 쟁취 한 후에도 여전히 불분명합니다.

노드에 대한 호출 함수를 작성하는 방법 오류 이벤트 처리를 구현해야 할 일이 있습니까?

내 질문을하는 또 다른 방법은 다음과 같습니다. 다음 기능을 어떻게 처리해야합니까?

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

또한 SO ( "node.js에서 비 차단 함수를 어떻게 작성합니까?")에 대한 이 질문이 흥미로웠다. 아직 답변을받지 못한 것입니다.


IO와 의미 함수를 혼동하는 것입니다. non.blocking IO가 더 좋겠 node.js는 non-blocking IO를 사용합니다. 그것을 이해하는 가장 좋은 방법은 ryan dahl의 비디오를 보는 것입니다.

노드에 대한 함수를 작성하는 방법

, 유일한 차이점은 즉시 실행되지 않고 전달되는 것입니다.

오류 이벤트 처리를 구현하는 방법

일반적으로 API는 오류를 첫 번째 인수로 사용하여 제공합니다. 예를 들어

database.query('something', function(err, result) {
  if (err) handle(err);
  doSomething(result);
});

일반적인 패턴입니다.

또 다른 일반적인 패턴은 on('error')입니다. 예를 들어

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});

편집하다 :

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

위의 함수를 호출 할 때

async_function(42, function(val) {
  console.log(val)
});
console.log(43);

42콘솔에 적으로 인쇄 합니다. 특히 process.nextTick현재 eventloop 호출 스택이 비어있는 후에 발생합니다. 호출 스택은 그 비어 async_function있고 console.log(43)실행되었습니다. 따라서 43과 42를 인쇄합니다.

아마도 이벤트 루프를 읽어야 할 것입니다.


충분하지 않습니다. 예를 들어, 함수를 만들려면 만들려면 settimer를 사용합니다.

예 : 기능이 아님 :

function a() {
  var a = 0;    
  for(i=0; i<10000000; i++) {
    a++;
  };
  b();
};

function b() {
  var a = 0;    
  for(i=0; i<10000000; i++) {
    a++;
  };    
  c();
};

function c() {
  for(i=0; i<10000000; i++) {
  };
  console.log("async finished!");
};

a();
console.log("This should be good");

위의 예제를 실행한다면 이것은 좋을 것입니다. 이러한 기능이 작동을 마칠 때까지 기다려야합니다.

의사 다중 스레드 (비동기) 함수 :

function a() {
  setTimeout ( function() {
    var a = 0;  
    for(i=0; i<10000000; i++) {
      a++;
    };
    b();
  }, 0);
};

function b() {
  setTimeout ( function() {
    var a = 0;  
    for(i=0; i<10000000; i++) {
      a++;
    };  
    c();
  }, 0);
};

function c() {
  setTimeout ( function() {
    for(i=0; i<10000000; i++) {
    };
    console.log("async finished!");
  }, 0);
};

a();
console.log("This should be good");

이것은 완전히 비동기 적입니다. 이것은 비동기가 완료되기 전에 작성 될 것입니다.


당신은 이것을 봐야한다 : Node Tuts 에피소드 19-비동기 반복 패턴

귀하의 질문에 답할 것입니다.


이것을 시도하면 노드와 브라우저 모두에서 작동합니다.

isNode = (typeof exports !== 'undefined') &&
(typeof module !== 'undefined') &&
(typeof module.exports !== 'undefined') &&
(typeof navigator === 'undefined' || typeof navigator.appName === 'undefined') ? true : false,
asyncIt = (isNode ? function (func) {
  process.nextTick(function () {
    func();
  });
} : function (func) {
  setTimeout(func, 5);
});

함수가 약속을 반환한다는 것을 알고 있다면 JavaScript의 새로운 async / await 기능을 사용하는 것이 좋습니다. 구문은 동 기적으로 보이지만 비동기 적으로 작동합니다. async함수에 키워드를 추가하면 await해당 범위에서 약속 할 수 있습니다 .

async function ace() {
  var r = await new Promise((resolve, reject) => {
    resolve(true)
  });

  console.log(r); // true
}

함수가 promise를 반환하지 않으면 정의한 새 promise로 래핑 한 다음 원하는 데이터를 해결하는 것이 좋습니다.

function ajax_call(url, method) {
  return new Promise((resolve, reject) => {
    fetch(url, { method })
    .then(resp => resp.json())
    .then(json => { resolve(json); })
  });
}

async function your_function() {
  var json = await ajax_call('www.api-example.com/some_data', 'GET');
  console.log(json); // { status: 200, data: ... }
}

결론 : 약속의 힘을 활용하십시오.


node.js에서 그러한 작업에 너무 많은 시간을 처리했습니다. 나는 주로 프론트 엔드 사람입니다.

모든 노드 메서드가 비동기식으로 콜백을 처리하고이를 Promise로 변환하는 것이 처리하는 것이 더 낫기 때문에 이것이 매우 중요하다고 생각합니다.

나는 가능한 결과, 더 간결하고 읽기 쉬운 것을 보여주고 싶습니다. 비동기로 ECMA-6을 사용하면 다음과 같이 작성할 수 있습니다.

 async function getNameFiles (dirname) {
  return new Promise((resolve, reject) => {
    fs.readdir(dirname, (err, filenames) => {
      err !== (undefined || null) ? reject(err) : resolve(filenames)
    })
  })
}

(undefined || null)위한 REPL 도 미정의 작업을 이용하여 (읽기 이벤트 프린트 루프) 시나리오.

참고 URL : https://stackoverflow.com/questions/6898779/how-to-write-asynchronous-functions-for-node-js

반응형