解析,saveAll在两个httpRequests(云代码作业)

时间:2015-05-18 15:52:40

标签: javascript parse-platform promise cloud-code

我正在经营一项执行以下工作的工作

  • 的HttpRequest
    • 处理
      • 使用一些已处理数据的httpRequest到不同的服务器
        • 更多处理,扩展Parse.Object模型然后
          • 白水回收

有一次,我只做了一个执行saveAll的httpRequest并且它有效。

添加第二个httpRequest后,saveAll停止工作

我已经阅读了一些关于“每个工作/功能的2个查询/ httpRequests”的轶事,然后我读了一些关于Promises的其他轶事,以及关于链接承诺的一些轶事,但此时我迷失了

所以我已经重写了这个作业以使用Promises但是我仍然在saveAll方法中出错

Parse.Cloud.job("myJob", function(request, status) {

Parse.Cloud.httpRequest({
    method: "GET",
    url: "https://api.website.com/api/method",
    headers: {
        "Content-Type": "application/json"
    }
}).then(function(httpResponse)
    /*,success: function(httpResponse)*/
    {

        var symbols = httpResponse.data["symbols"];

        var tickerNames = new Array();

        symbols.forEach(function(obj) {

            tickerNames.push(obj.symbol);
            //maybe do a before save method to check if it already exists               

        });

        return tickerNames;
    }).then(function(tickerNames) {

    return Parse.Cloud.httpRequest({
        method: "GET",
        url: "https://api.secondsite.org/api/" + tickerNames.join(","),
        headers: {
            "Authorization": "Bearer ACCESSTOKEN",
            "Accept": "application/json"
        }
        /*,
                            success: function(httpResponse) {*/
    }).then(function(httpResponse) {

            var serverObjects = new Array();

            var objectArray = httpResponse.data["quotes"]["quote"];
            objectArray.forEach(function(obj) {

                var SocialPicks = Parse.Object.extend("SocialPicks");
                var newPick = new SocialPicks();
                newPick.set("symbol", obj.symbol);
                newPick.set("title", obj.description);
                newPick.set("changePercent", obj.change_percentage);
                newPick.set("volume", obj.volume);
                newPick.set("avgVolume", obj.average_volume);

                //newPick.save();

                serverObjects.push(newPick);

            });

            //console.log(serverObjects[0].symbol);

            var promise = Parse.Promise.as();

            promise = promise.then(function(){
                return Parse.Object.saveAll(serverObjects)
                .then(function(list) {

                    console.log("saveAll success");
                    status.success("success");

                }, function(error) {
                    console.log("saveAll error");
                    status.error("not successful saving");
                });
            })

            return promise;

        },
        /*error: function(error) {*/
        function(httpResponse) {
            console.log("ERROR");
            status.error("not successful network call");
        }
    );

});

  });

这总是失败status.error("not successful saving");,无论我是否使用promises或此方法的顺序版本而没有承诺

此时我不确定我是否达到了解析限制,或者我是否使用了错误的承诺,或者两者都没有,或者其他

所以,如果有人有经验在Cloud Code中执行后续的httpRequests然后编写对象,那么洞察力会很有帮助

2 个答案:

答案 0 :(得分:1)

对于它的价值,这里是我对代码的简化。

我做了三个主要的mod:

  • 在两个地方使用array.map()来构建tickerNamesserverObjects
  • 取消serverObjects / saveall()例程,将其置于外部承诺链中。
  • 清除不必要的Parse.Promise.as()
Parse.Cloud.job("myJob", function(request, status) {
    Parse.Cloud.httpRequest({
        method: 'GET',
        url: 'https://api.website.com/api/method',
        headers: {
            'Content-Type': 'application/json'
        }
    }).then(function(httpResponse) {
        var tickerNames = httpResponse.data.symbols.map(function(obj) {
            return obj.symbol;
            //maybe do a before save method to check if it already exists
        });
        return Parse.Cloud.httpRequest({
            method: 'GET',
            url: 'https://api.secondsite.org/api/' + tickerNames.join(),
            headers: {
                'Authorization': 'Bearer ACCESSTOKEN',
                'Accept': 'application/json'
            }
        });
    }).then(function(httpResponse) {
        var serverObjects = httpResponse.data.quotes.quote.map(function(obj) {
            var SocialPicks = Parse.Object.extend("SocialPicks");
            var newPick = new SocialPicks();
            newPick.set('symbol', obj.symbol);
            newPick.set('title', obj.description);
            newPick.set('changePercent', obj.change_percentage);
            newPick.set('volume', obj.volume);
            newPick.set('avgVolume', obj.average_volume);
            return newPick;
        });
        return Parse.Object.saveAll(serverObjects).then(function(list) {
            console.log('saveAll success');
            status.success('success');
        }, function(error) {
            console.log('saveAll error: ' + error.message);
            status.error('not successful saving');
        });
    }, function(httpResponse) {
        console.log('ERROR: ' + error.message);
        status.error('not successful network call');
    });
});

请注意,这并不能解决报告的错误,我们现在知道这些错误位于其他地方,但在其他方面可能会有所帮助。

答案 1 :(得分:0)

原因是由于其中一个API服务器出现类型错误而导致错误。

它提供了一个int,我的模型正在寻找该变量的字符串

在离开问题一段时间后,我意识到我没有打印出该方法试图告诉我的实际错误。打印出来,在控制台中看到问题,解决了问题。

“erot demonstratum”