2017-01-06 11 views
0

私は約束の仕組みを理解しようとしているが、結果が得られていない。私は多くの例を試してきましたが、何も動作しません。httpRequestsが応答を送信する前に終了するまで待つ - ParseServer

このコードは、私が要求するURLの一部である配列o文字列を受け取るParseクラウドコード関数です。したがって、3要素の配列を受け取った場合、コードはhttprequestを3にする必要がありますurlは3つの応答を集めてクライアントに送信します。これは私がやったことです:

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; 
} 

私が得る応答は次のとおりです。

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

答えて

0

私は入力を以下ましdocumentationをチェックすることにより:

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); 

} 

あなたはParse.Promise.asを使用しています約束を即座に解決している場合は、Parse.Promise.asの文書を確認してください。

documentationParse.Promise.whenにチェックしてください。

+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"); 
    }); 

} 
関連する問題