Сбой Parse, saveAll после двух httpRequests (задание Cloud Code)

Я выполняю задание, которое делает следующее

  • httpЗапрос
    • processing
      • httpRequest to different server using some of the processed data
        • more processing, extending a Parse.Object model and then
          • saveAll

В какой-то момент я делал только один httpRequest, который делал saveAll, и это работало.

После того, как я добавил второй httpRequest, saveAll перестал работать

Я читал некоторые анекдотические вещи о «2 запросах/httpRequests для задания/функции», а затем я читал некоторые другие анекдотические вещи о промисах и некоторые анекдотические вещи о цепочке обещаний, но на данный момент я потерян

поэтому я переписал это задание, чтобы использовать обещания, но я все еще получаю сообщение об ошибке в методе 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"); , использую ли я промисы или последовательную версию этого метода без промисов

на данный момент я не уверен, что я наткнулся на ограничение синтаксического анализа, или я неправильно использую промисы, или и то, и другое

поэтому, если у кого-то есть опыт выполнения последующих httpRequests в облачном коде, а затем написания объектов, понимание было бы полезно


person CQM    schedule 18.05.2015    source источник
comment
Фактический код, сокращенный до минимального случая сбоя, очень помог бы.   -  person Benjamin Gruenbaum    schedule 18.05.2015
comment
@BenjaminGruenbaum из моего опыта использования тега javascript я знаю, что здешнее сообщество любит видеть код даже там, где он не нужен. Это больше связано с ограничением Parse, с которым у кого-то может быть опыт работы.   -  person CQM    schedule 18.05.2015
comment
Это здорово, но мой опыт работы с тегом promises показывает, что невероятно сложно отлаживать код обещаний, не видя, что пытается сделать OP, и очень мало чего можно сделать, просто показав, как это сделать (затем цепочку (запуск в последовательности), агрегацию (. все) и так далее).   -  person Benjamin Gruenbaum    schedule 18.05.2015
comment
@BenjaminGruenbaum хорошо, я подумаю о добавлении своей функции   -  person CQM    schedule 18.05.2015
comment
@BenjaminGruenbaum обновлен кодом   -  person CQM    schedule 19.05.2015
comment
}).then(function(tickerNames) { Parse.Cloud.httpRequest({ здесь не хватает return.   -  person Benjamin Gruenbaum    schedule 19.05.2015
comment
@BenjaminGruenbaum хорошо, я изменил его на .then(function(tickerNames) { return Parse.Cloud.httpRequest({ та же ошибка not successful saving   -  person CQM    schedule 19.05.2015
comment
.then(function(tickerNames), похоже, не привязан к обещанию. Я что-то упускаю?   -  person Dave Alperovich    schedule 28.05.2015
comment
Было бы полезно увидеть первую версию кода - до того, как вы добавили второй httpRequest.   -  person Roamer-1888    schedule 28.05.2015
comment
@DaveAlperovich, как бы ты переписал это так, чтобы оно было приковано   -  person CQM    schedule 31.05.2015


Ответы (2)


Для чего это стоит, вот мое упрощение кода.

Я сделал три основных мода:

  • Использовал array.map() в двух местах для сборки tickerNames и serverObjects.
  • Отключил подпрограмму 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');
    });
});

Обратите внимание, что это не устраняет обнаруженную ошибку, которая, как мы теперь знаем, лежит где-то еще, но может быть полезна в других отношениях.

person Roamer-1888    schedule 03.06.2015
comment
спасибо, вы оба, скорее всего, получите половину награды - person CQM; 03.06.2015
comment
@CQM, я не беспокоюсь о награде, это не имеет большого значения. Кроме того, вы сами решили проблему в конце концов. - person Roamer-1888; 03.06.2015

Оказалось, что это ошибка из-за ошибки типа на одном из серверов API.

Он предоставлял int, и моя модель искала строку в этой переменной.

Отойдя на некоторое время от проблемы, я понял, что не печатал реальную ошибку, о которой метод пытался мне сообщить. Распечатал, увидел проблему в консоли, устранил проблему.

quot erot demostratum

person CQM    schedule 05.06.2015