Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析云代码保存未执行。_Javascript_Json_Parse Platform - Fatal编程技术网

Javascript 解析云代码保存未执行。

Javascript 解析云代码保存未执行。,javascript,json,parse-platform,Javascript,Json,Parse Platform,我正在为我的IOS应用程序编写一段云代码(解析),并注意到每当我试图保存更新的对象时,它都无法工作。如果删除save函数,代码将工作并打印成功响应,但如果保留该函数,则会出现错误: Error Domain=NSCocoaErrorDomain code=3840“JSON文本未以数组或对象开头,允许未设置片段的选项。”UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,允许未设置片段的选项。} 我已经尝试了很多解决方案,不管它们是什么,如果代码中有save

我正在为我的IOS应用程序编写一段云代码(解析),并注意到每当我试图保存更新的对象时,它都无法工作。如果删除save函数,代码将工作并打印成功响应,但如果保留该函数,则会出现错误:

Error Domain=NSCocoaErrorDomain code=3840“JSON文本未以数组或对象开头,允许未设置片段的选项。”UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,允许未设置片段的选项。}

我已经尝试了很多解决方案,不管它们是什么,如果代码中有save函数,上面的错误消息仍然会从X-Code调试器打印出来。(如果不是,则打印成功响应)

代码如下:

Parse.Cloud.define("removeFriend", function(request, response) {
Parse.Cloud.useMasterKey();
var userObjId = request.params.userObjId;
var currentUser = request.params.currentUser;
var query = new Parse.Query(Parse.User);
query.equalTo("objectId", userObjId);
//query.include('Friends');
query.find({
    success: function(results){
        var friendsArray = (results[0].get("Friends"));
        var newFriends = friendsArray.filter(function(x) {return x != currentUser});

        results[0].set("Friends", newFriends);
        results[0].save();
        response.success("THIS IS RESULT" + results[0].get("Friends"));



    },
    error: function(){
        response.error("The user was not successfully removed.");   

    }   
});

});

(我在前面创建了一个类似的问题,但出现了相同的错误,但此后重新编写了代码,因此我不想将这两个问题混在一起。)

保存是异步的,这意味着它们发生在单独的线程中。在调用
save()
之后,您将返回
response.success()
,因此在函数终止之前,保存永远不会完成

您有两个选项:向
save()
调用添加成功/错误选项,或使用承诺。我更喜欢后者,当你掌握了它们的诀窍时,它可以让代码更简洁

results[0].save().then(
    function( success ) {
        response.success("THIS IS RESULT" + results[0].get("Friends"));
    },
    function( error ) { 
        response.error("There was an error trying to save the object: " + JSON.stringify(error)); 
    }
);

谢谢,这解决了问题,帮助我理解了问题的真正起因。没问题。我遗漏的一个重要部分——异步性/在单独的线程上运行本身并不是问题所在,但在另一个线程上运行的函数是一个服务器调用,这需要时间来完成。您的服务器几乎立即执行响应调用,因此没有时间完成异步操作。在http请求、获取、查询、销毁和调用其他云函数时也会遇到同样的问题;已在解析服务器版本2.3.0(2016年12月7日)中被弃用。从那个版本开始,它是一个无操作(它什么也不做)。现在,您应该将{useMasterKey:true}可选参数插入到需要在代码中重写ACL或CLP的每个方法中。