JavaScript和云代码function,共享相同的变种
我使用parse.com
作为我的iOS
应用程序的后端服务。 我试图做的一切都在objective-c
因为我没有任何JavaScript
经验,但事实certificate,我需要在JavaScript
开发一些Cloud Code Functions
来完成我的app
。
我试图创build一个简单的例程:
- 用户使用
Cloud Function
检索对象。 - 用户将另一个对象保存在不同的类中。
-
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,你为了多重目的而重复使用。
您将query
variables定义为查询,使用它,但是在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.'); } }); });