Parse承诺多个httpRequest云代码

Parse Promises Multiple httpRequest Cloud Code

本文关键字:代码 httpRequest 承诺 Parse      更新时间:2023-09-26

我正在用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. 您的promises数组应该放在for循环作用域之外。否则,您的promise数组将被分配为一个新的空白数组,每个循环

  2. Parse.File将在其父文件保存时自动保存,不需要预先保存

所以我改进你的代码如下,试一下,告诉我它是否工作。

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