JavaScript和云代码function,共享相同的变种

我使用parse.com作为我的iOS应用程序的后端服务。 我试图做的一切都在objective-c因为我没有任何JavaScript经验,但事实certificate,我需要在JavaScript开发一些Cloud Code Functions来完成我的app

我试图创build一个简单的例程:

  1. 用户使用Cloud Function检索对象。
  2. 用户将另一个对象保存在不同的类中。
  3. afterSave函数在云中运行以更新首先检索的对象。

现在,这是我的代码:

 var UserConfigOrientador = Parse.Object.extend("UserConfigOrientador"); var query = new Parse.Query(UserConfigOrientador); Parse.Cloud.define('pegarOrientadorLivre', function(request, response) { Parse.Cloud.useMasterKey(); query.greaterThan("entrevistasDisponibilidade", 0); query.first({ success: function(results) { response.success(results); query = results; }, error: function(error) { response.error('Favor, checar rede e tentar novamente.'); } }); }); // AfterSave Parse.Cloud.afterSave("Agenda", function(request) { Parse.Cloud.useMasterKey(); query.set("entrevistasDisponibilidade", 70); query.save(); } }); }); 

现在,第二个函数不工作,我得到的消息,对象没有set方法。

基本上,我的问题是:

如何在function之间共享数据? 我应该保存在main.js一切,还是我可以使用另一个文件?

我正在使用webStorm进行开发。 而关于main.js的问题是,过了一段时间,我会有很多的function,我想弄清楚如何组织我的代码。

你的问题是一个范围,和你命名不当的variables,你为了多重目的而重复使用。

您将queryvariables定义为查询,使用它,但是在success处理程序中将其设置为查询结果(您现在有一个称为query的variables,它实际上是您的UserConfigOrientador类的一个实例)。

当Cloud Code完成运行时,结果超出范围,很可能会设置为undefined 。 您不应该试图在多个Cloud Code方法之间共享variables。

Agenda对象上有什么东西可以让你知道哪个UserConfigOrientador要更新? 也许你可以添加一个指针属性到UserConfigOrientador ? 如果你这样做,那么你可以使用以下内容:

 // AfterSave Parse.Cloud.afterSave("Agenda", function(request) { Parse.Cloud.useMasterKey(); var userConfigOrientadorQuery = new Parse.Query("UserConfigOrientador"); // read "userConfigOrientador" pointer property on "Agenda" object var userConfigId = request.object.get("userConfigOrientador").id; userConfigOrientadorQuery.get(userConfigId, { success: function(userConfigOrientador) { userConfigOrientador.set("entrevistasDisponibilidade", 70); userConfigOrientador.save(); } }); }); 

嗯..我不认为这是相当符合你期望的方式。

当您的Cloud代码运行时,您的初始var query声明确实在您的云function和afterSave函数的范围内可用。 但是,你没有正确传递它。 事实上,我有点困惑,因为你的查询似乎是请求一个UserConfigOrientador对象,而你的afterSave是一个Agenda对象。

所以这里有两件不同的事情。 因为你实际上并没有保存一个议程对象,所以我假设你的response.success()返回一个UserConfigOrientador对象的JSON返回到客户端,在这一点你做一些操作,然后保存基于该结果的Agenda对象。

此时,当您现在save() Agenda对象时, afterSave()函数将运行,但您的查询值将为var query = new Parse.Query(UserConfigOrientador); 没有设置方法。 这就是你得到错误的原因。

我什至不知道你的query = results; 行将实际执行,因为您应该在子例程的END处调用它,并向Parse发信号表示它已结束。

如果你能告诉我你是如何保存Agenda对象,我可以完成这个图片。

编辑:—抽象,但也许这是你正在寻找模式…

 var ObjectA = Parse.Object.extend('ObjectA'); var queryObjectA = new Parse.Query('ObjectA'); Parse.Cloud.define('findObjectX', function(request, response) { Parse.Cloud.useMasterKey(); // other query options here... query.first({ // the first() function will return a Parse.Object success: function(objectX) { // Now you have objectX // Now you want to save some other object var otherObj = new ObjectA(); // Do things to otherObj otherObj.save({ success: function(result) { // will be the saved otherObj // Now you do stuff to your queried obj and save objectX.set('something', result); // or whatever // Note, it accomplishes what I think you want without afterSave() } }); // async... but we can just let this guy go }, error: function(error) { response.error('Favor, checar rede e tentar novamente.'); } }); });