2016-08-30 2 views
2

나는 조언을 찾고 있으므로 여기 어딘가에서 요점을 놓치고있을 것입니다.노드의 콜백 결과를 별도의 함수로 사용하기

클라이언트 연결을 수신하고 수신 된 데이터를 기반으로 nodejs 서버에 API 호출이 있습니다.

해당 API에 대한 첫 번째 호출은 함께 그룹화하기 위해 후속 호출에서 사용해야하는 ID를 가져옵니다.

내가 고심하는 것은 API 호출이 반드시 비동기이며 콜백에서 ID를 변수에 할당한다는 것입니다. 비동기 호출이 API 서버에 의해 처리되는 동안 더 많은 데이터가 클라이언트에서 들어오고 더 많은 API 호출이 필요하지만 두 번째 호출이 의존하여 첫 번째 호출의 결과를 알기 전까지는 호출 할 수 없습니다.

이 문제를 해결하는 적절한 방법은 무엇입니까? 두 번째 API 호출의 결과를 약속하기 위해 Q를 사용해야하는 것처럼 느껴지지만 구조화 방법을 잘 모르겠습니다. 또는 첫 번째 완료 될 때까지 API 호출을 대기열에 두어야합니까? 내가 어떻게 그럴 수 있니?

예 문제 코드 :

var server = net.createServer(); 

//set up the callback handler 

server.on('connection', handleConnection); 

handleConnection(conn) { 
    //do some stuff... 
    firstAPICall(); 
    conn.on('data', handleData); 
} 

handleData(data) { 
    //do some stuff... 
    otherAPIcall(); 
} 

firstAPICall() { 
    client.get("http://myAPI/getID", function (data, response) { 
    conn.myID = data[0].myID; 
    } 
    } 
} 

otherAPICall() { 
    //How do I make sure I actually have a value 
    //in conn.myID from the first function??? 
    client.post("http://myAPI/storeData", { data: {myID:conn.myID, data:someData} }, function (data, response) { 
    //do some stuff... 
    } 
    } 
} 
+0

누락 된 점은 "해당 API에 대한 첫 번째 호출은 이후의 호출을 함께 그룹화하는 데 사용해야하는 ID를 얻습니다."입니다. 요구 사항이거나 그렇지 않습니다. 너의 마음을 위로해라 – Tibrogargan

답변

1

예, 이에 대한 약속을 사용해야합니다. 아마 당신이 여분의 기능에 client.get 호출의 결과에 대한 약속을 만드는 밖으로 고려한다

handleConnection(conn) { 
    //do some stuff... 
    var idPromise = firstAPICall(); 
    conn.on('data', function handleData(data) { 
    //do some stuff... 
    otherAPIcall(idPromise).then(function(result) { 
     … 
    }); 
    }); 
} 

firstAPICall() { 
    return Q.Promise(function(resolve, reject) { 
    client.get("http://myAPI/getID", function (data, response) { 
     resolve(data[0].myID); 
    }); 
    }); 
} 

otherAPICall(idPromise) { 
    return idPromise.then(function(myID) { 
    return new Promise(function(resolve, reject) { 
     client.post("http://myAPI/storeData", { 
     data: {myID:myID, data:someData} 
     }, function (data, response) { 
     //do some stuff... 
     resolve(…); 
     }); 
    }); 
    }); 
} 

: 비동기 첫 번째 통화에서 해결 된 ID에 대한 약속을 확인하고 후속 호출에 사용 . 또한 올바르게 오류를 처리하고 reject을 호출하십시오. client이 노드 콜백 규칙을 사용하면 Q에 대해서도 some nice helper functions이 있습니다.

+0

나는 결국 약속들과 함께 갔다. 그리고 그것은 잘 작동하고있는 것처럼 보인다 - 고마워! – Kristan

1

약속을 사용해보십시오. 그런 다음 '다음'을 사용하여 다른 APICall()을 호출하십시오.

1

연결 후 즉시 데이터를 전송할 것으로 생각할 수 있습니다. 따라서 단순화하고 다른 AP를 체크인 할 수 있습니다. ID가 있으면 ID로, 그렇지 않으면 콜백 만 사용할 수 있습니다. 약속 또는 async/await 키워드를 사용하면 상황에 따라 선을 더 멋지게 만들 수 있지만 필수는 아닙니다.

var server = net.createServer(); 

//set up the callback handler 

server.on('connection', handleConnection); 

handleConnection(conn) { 
    conn.on('data', handleData(connm, data)); 
} 

handleData(conn, data) { 
    //do some stuff... 
    otherAPIcall(conn); 
} 

checkID(conn, cb) { 
    if (!conn.myID) { 
    client.get("http://myAPI/getID", function (data, response) { 
     conn.myID = data[0].myID; 
     cb(); 
    }); 
    } else { 
    cb(); 
    } 
} 

otherAPICall(conn) { 
    checkID(conn, function() { 
    client.post("http://myAPI/storeData", { data: {myID:conn.myID, data:someData} }, function (data, response) { 
     //do some stuff... 
    }); 
    }); 
} 
0

약속

function async(value) { 
var deferred = $q.defer(); 
var asyncCalculation = value/2; 
deferred.resolve(asyncCalculation); 
return deferred.promise; 
} 

var promise = async(8) 
.then(function(x) { 
    return x+1; 
}) 
.then(function(x) { 
    return x*2; 
}) 
.then(function(x) { 
    return x-1; 
}); 
promise.then(function(x) { 
console.log(x); 
}); 

이 값은 모든 성공 콜백 통과하므로 값 (9)가 기록되고, 체인 값 수 있고, 콜의 리턴 값으로 발생한 후에 항상 해결 ((8/2 + 1) * 2 - 1).

+1

그렇습니다. 약속이 작동하는 방식입니다. 그러나 이것이 질문과 무슨 상관이 있습니까? – Bergi

+0

Btw, OP는 각도 약속이 아닌 Q를 사용합니다. – Bergi

+0

이 케이스는 약속의 작동 방식과 사용 방법을 보여줍니다. 만약 내가 약속을 잘 이해한다면, 어떤 Q 또는 Angularjs $ q 이건, 그들은 같은 원칙에 근거합니다. 약속의 작동 방식을 이해한다면 어떻게 다른 영역에서 사용할 수 없습니까? – Eric

관련 문제