繁体   English   中英

Parse.com和闭包

[英]Parse.com and closures

我有一个Cloud Code函数,它将执行同一块n次。 该块包含一个带有auth标头的http调用。 为简单main.js ,我在main.js的根目录下创建了一个函数。 该函数需要返回结果并将authData保留在内存中(以便将其重用于以后的调用)。

function requestURI (uri){
    var authData; // gets generated if null, should be reused if not null
    var result; // supposingly contains the results

    return something();
}

该函数something()是一个Parse.Promise,因为我需要异步调用。 据我了解,我无法将结果或authData附加到我的诺言中。...如果我在requestURI()函数中运行console.log() requestURI() ,我会看到authData和结果正确填充了预期的结果

然后,我希望从Parse函数获得此函数。 (整个目的是使该功能可被其他任何人重用)

Parse.Cloud.define("testCall", function(request, response) {
    var uri1 = '...';
    var uri2 = '...';
    var uri3 = '...';

    return requestURI(uri1).then(function(){
        // how do I get the result of my request?
        return request(uri2);
    }).then(function(){
        // how do I get the result of my request?
        return request(uri3);
    });
}

我的问题是我无法从requestURI函数中检索结果,并且每次运行该函数时authData似乎authData重置

我读到解决方案在于闭包,但我无法理解它们……

编辑:添加功能something():

 return Parse.Cloud.httpRequest({
        method: 'GET',
        url: url,
        headers: {
            "Authorization" : digestAuthHeader
        },
        success: function(httpResponse) {
            // all went well, let's increase the nonceCount, for future calls
            authData["nc"] += 1;
            // I need to return the result object in a promise
            result = httpResponse.data;
            // return a Promise that can be handled by any function
            return Parse.Promise.as(result)); // this promise doesn't work
        },
        error: function(httpResponse) {
            console.error('Request failed with response code ' + httpResponse.status);
            return (null,Parse.Promise.error(httpResponse.text));
        }
    });

编辑:这是我正在尝试

// authData is not null, we can make an authenticated call
function makeAuthenticatedRequest(){
    // generate the appropriate auth Header;
    var digestAuthHeader = generateDigestAuthHeader();

    return Parse.Cloud.httpRequest({
        method: 'GET',
        url: url,
        headers: {
            "Authorization" : digestAuthHeader
        }}).then(function(httpResponse) {
            // all went well, let's increase the nonceCount, for future calls
            authData["nc"] += 1;
            // create the final object to return in a promise
            result = httpResponse.data;

            console.log(result) // returns something not null!!!

            // return a Promise that can be handled by any function
            return promise.resolve({'authData': authData, 'result': result});
        },
        function(error) {
            console.error('Request failed with response code ' + error.status);
            return (null,Parse.Promise.error(error));
        });
}


Parse.Cloud.define("testCall", function(request, response) {
    var uri1 = '...';
    var authData;


    return apiCall1001Menus(authData,uri1).then(function(result){
        response.success(result); // returns {}
    });

});

我的回复回调是{}! 这根本不是我所期望的

我会举一个例子,以防止我的英语不好引起误导。

以下重写function makeAuthenticatedRequest() callback 推迟反模式promise时尚。

打回来:

延迟反模式:

function makeAuthenticatedRequest(){
    // generate the appropriate auth Header;
    var digestAuthHeader = generateDigestAuthHeader();
    var promise = new Parse.promise();
    Parse.Cloud.httpRequest({
        method: 'GET',
        url: url,
        headers: {
            "Authorization" : digestAuthHeader
        },
        success: function(httpResponse) {
            // all went well, let's increase the nonceCount, for future calls
            authData["nc"] += 1;
            // create the final object to return in a promise
            result = httpResponse.data;

            console.log(result) // returns something not null!!!

            // return a Promise that can be handled by any function
            promise.resolve({'authData': authData, 'result': result});
        },
        error: function(error) {
            console.error('Request failed with response code ' + error.status);
            // it could be promise.resolve (success) or promise.reject (error)
            promise.reject(error);
        }
    });
    return promise;
}

承诺

function makeAuthenticatedRequest(){
    // generate the appropriate auth Header;
    var digestAuthHeader = generateDigestAuthHeader();

    return Parse.Cloud.httpRequest({
            method: 'GET',
            url: url,
            headers: {
                "Authorization" : digestAuthHeader
            }
        }).then(function(httpResponse) {
            // all went well, let's increase the nonceCount, for future calls
            authData["nc"] += 1;
            // create the final object to return in a promise
            result = httpResponse.data;

            console.log(result) // returns something not null!!!

            // return a Promise that can be handled by any function
            return {'authData': authData, 'result': result};
        }, function(error) {
            console.error('Request failed with response code ' + error.status);
            return Parse.Promise.error(error);
        });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM