2017-01-06 3 views
0

약속 작동 방식을 이해하려고하지만 결과가 표시되지 않습니다. 나는 많은 예제로 시도했지만 아무것도 작동하지 않습니다.응답을 보내기 전에 httpRequests가 완료 될 때까지 기다리십시오. - ParseServer

이 코드는 배열 o 문자열을받는 Parse cloudcode 함수입니다. 각 코드는 요청한 URL의 일부이므로 3 개의 요소 배열을 받으면 코드는 3의 httprequest를 만들어야합니다 url은 3 개의 응답을 수집하여 클라이언트에게 보냅니다. 당신은 Parse.Promise.as을 사용하고

Parse.Cloud.define('getInfo', function(request,response) { 

    var placas = request.params.placa; 

    x(placas).then(function(result){ 
    response.success(result); 
    }).error(function(error){ 
    response.error(error); 
    }); 
}); 

function x(placas,error){ 
    var url1 = 'http://XXXXX/'; 
    var promises = []; 

    for(var i=0; i<placas.length ;i++){ 
    var url2 = url1.concat(placas[i]); 
    promises.push(requestMulta(url2)); 
    } 

return Parse.Promise.when(promises); 

} 

을 : 내가 입력 다음 한 documentation을 확인하여

{ 
    "_rejected" = 0; 
    "_rejectedCallbacks" =  (
    ); 
    "_resolved" = 1; 
    "_resolvedCallbacks" =  (
    ); 
    "_result" =  (
      (
      "<null>", // 3 null's because I'm testing with an array o 3 elements 
      "<null>", 
      "<null>" 
     ) 
    ); 
} 

답변

0

:

Parse.Cloud.define('getInfo', function(request,response) { 

    var placas = request.params.placa; 

    x(placas, function(result){ 
    response.success(result); 
    }, function(error){ 
    response.error(error); 
    }); 
}); 

function x(placas,callback,error){ 
    var url1 = 'http://XXXXX/'; 
    var promises = []; 

    for(var i=0; i<placas.length ;i++){ 
    var url2 = url1.concat(placas[i]); 
    promises.push(requestMulta(url2)); 
    } 

    var data = Parse.Promise.as(promises); 
    callback(data); 
} 

function requestMulta(url){ 
    var promise = new Parse.Promise(); 
    Parse.Cloud.httpRequest({ 
     url: url , 
     headers: { 
     'Content-Type': 'application/json;charset=utf-8' 
     } 
    }).then(function(httpResponse) { 
     ... 
     promise.resolve(data); 
    }, function(httpResponse) { 
    //Handle error 
    }); 
    return promise; 
} 

내가 얻을 응답은 : 이것은 내가 무슨 짓을했는지입니다 약속을 즉시 해결하려는 경우 Parse.Promise.as에 대한 문서를 확인하십시오.

Parse.Promise.when에 대해 documentation을 확인하십시오.

+0

가 나는 또한 동일한 결과를 얻는 그 방법을 시도, 나는 확실히 당신이 위의 코드를 사용하여 당신이 있습니까 – Rafaalvfe

+0

는 HTTP 응답을 얻기 전에 함수 requestMulta 마무리되는 것 같다? 약속이 해결되지 않은 특정 위치에서 console.log()로 확인할 수 있습니까? – MemLeak

0

변경 사항이 끝나서 다른 사람에게 유용하기를 바랍니다.

Promise를 사용하는 대신 여러 개의 비동기 기능을 수행하는 데 도움이되는 Async (http://caolan.github.io/async/) 라이브러리를 설치 했으므로 사용하기가 쉽습니다.

새로운 코드 :

Parse.Cloud.define('getInfo', function(request,response) { 

    var placas = request.params.placa; //this is an array whith the variables I'll use in the functons 

    x(placas).then(function(result){ 
    response.success(result); 
    }).error(function(error){ 
    response.error(error); 
    }); 
}); 

function x(placas,callback,error){ 

    async.map(placas, requestMulta, function(err, results) { 
     console.log(results) 
     callback(results); 
    }); 
} 

function requestMulta(placa, callback){ 

    var url = 'http://XXXXX/' + placa; 
    Parse.Cloud.httpRequest({ 
     url: url , 
     headers: { 
      'Content-Type': 'application/json;charset=utf-8' 
     } 
    }).then(function(httpResponse) { 

     //... (The process you want)... 

     callback(null,data); 

    }, function(httpResponse) { 

     var data = {}; 
     console.error('Request failed with response code '); 
     error("Error"); 
    }); 

} 
관련 문제