解析承诺多个httpRequest云代码

时间:2015-08-30 22:34:07

标签: javascript parse-platform cloud-code

我正在使用Parse.com和Cloud Code编写iOs应用程序。实际上我想从网站中检索包含一张图片和其他信息的对象,我想将它们添加到名为新闻的类中。当我运行我的代码时,每个对象都被保存(在我的类中,一行=一个检索到的对象)但不幸的是,唯一的第一个保存了它的图片....任何想法?

我做了很多关于承诺(系列/平行)的搜索,我认为这个问题来自这里..

注意:不要担心 myLink,myImgLink :我这样做是为了让我的代码易于阅读!

Parse.Cloud.define("rajouteNews", function(request, response) {
    Parse.Cloud.httpRequest({ url: 'myUrl'}).then(function(httpResponse) {

            var news = [];
            var NewsClass = Parse.Object.extend("news");
            for (var i = 0; i < 10 ; ++i) {
                var maNews = new NewsClass();
                maNews.set("link", myLink[i]); // "Other informations"
                maNews.set("imgLink", myImgLink[i]);
                maNews.set("title", myTitle[i]);

                var promises = [];
                promises.push(Parse.Cloud.httpRequest({
                    url: $('img').attr('src'),
                    method: 'GET',
                }).then(function(httpResponse){
                        var imgFile = new Parse.File("photo.jpg", {base64:httpResponse.buffer.toString('base64')});
                        maNews.set("image",imgFile); // The picture
                        return maNews.save();
                }));
                news.push(maNews);  
            }               
            promises.push(Parse.Object.saveAll(news, {
                success: function (list) {
                    response.success(news.length.toString() + " ont été sauvegardées");

                },
                error: function (list, err) {
                    response.error("Error adding news");
                }
            }));
            return Parse.Promise.when(promises);

        }).then(function(bla,result){
            response.success("Job done");       
        }, function(error) {
        response.error(error);
    }
);
});

1 个答案:

答案 0 :(得分:0)

  1. 您的promises数组应该退出for循环范围。否则,您的promise数组将被分配为每个循环的新空白数组。

  2. 当其父母保存时,
  3. Parse.File会自动保存,您无需提前保存。

  4. 所以我改进了你的代码如下,尝试并告诉我它的工作天气。

    Parse.Cloud.define("rajouteNews", function(request, response) {
        Parse.Cloud.httpRequest({
          url: 'myUrl'
        }).then(function(httpResponse) {
          var promises = [];
          var NewsClass = Parse.Object.extend("news");
          for (var i = 0; i < 10; ++i) {
            var maNews = new NewsClass();
            maNews.set("link", myLink[i]); // "Other informations"
            maNews.set("imgLink", myImgLink[i]);
            maNews.set("title", myTitle[i]);
    
            var maNewsPromise = Parse.Cloud.httpRequest({
              url: $('img').attr('src'),
              method: 'GET',
            }).then(function(httpResponse) {
              var imgFile = new Parse.File("photo.jpg", {
                base64: httpResponse.buffer.toString('base64')
              });
              maNews.set("image", imgFile); // The picture
              return maNews.save();
            });
            promises.push(maNewsPromise);
          }
          return Parse.Promise.when(promises)
        }).then(function(bla, result) {
          // this function is call when `Parse.Promise.when(promises)` is done,
          //I can't figure out why you take two params.
          response.success("Job done");
        }, function(error) {
          response.error(error);
        });
      });