如何使Parse中的保存功能以同步方式工作

时间:2015-01-13 09:29:32

标签: javascript asynchronous parse-platform

我的初始代码:

var Group = Parse.Object.extend("Group");
var myGroup = new Group();
myGroup.set("groupName", "book");
myGroup.set("category", "Hobby");
myGroup.save(null, {
    success: function(object) {
    },
    error: function(error) {
        // Fail
    }
});
alert("now go");

所以输出: 首先是现在去打印,然后由于异步性质保存功能

然后我修改为:

var Group = Parse.Object.extend("Group");
var myGroup = new Group();
myGroup.set("groupName", "book");
myGroup.set("category", "Hobby");
myGroup.save(null).then(
    function(object) {
    },
    function(error) {
        // Fail
    }
);
alert("now go");

现在输出: TypeError:myGroup.save(...)。然后不是函数但是在Parse中添加了组对象我不知道为什么?为什么我收到此错误?

所以,我搜索了stackoverflow和google,bu对我来说找不到有用的东西。我对这个非同步的东西很陌生,真的。我想让这个保存功能同步工作,我已经阅读了Promise的内容但却无法真正得到它。

1 个答案:

答案 0 :(得分:1)

Promise不允许您将异步代码转换为同步代码。它们是构建异步代码的另一种方法 - 通过复杂的链通常更容易理解。但是您发布的两个代码示例实际上是等效的。

很少有任何理由让您的JavaScript异步,尤其是在向服务器发布更新时。 JavaScript(通常)是单线程的,这意味着它一次只能做一件事。在许多设备上,如果您的JavaScript在继续之前等待save调用完成,那么整个界面将会锁定。即使用户可以滚动,他们也无法与应用程序中的任何其他元素进行交互。必须有一个更好的方法。

更好的方法是使用回调函数save调用完成后执行某些操作。例如,如果您希望在成功保存后进行alert调用,则可以通过以下方式执行此操作:

myGroup.save(null, {
    success: function(object) {
        alert("now go");
    }
});

更实际的是,假设您的应用中有几个(jQuery-dependent)函数可以让您显示和隐藏状态栏:

<!-- Somewhere in your HTML templates... -->
<div class="status-loading" style="display: none">
    <img src="spinner.gif" alt="Spinner" />
    <p>Loading...</p>
</div>
/* Somewhere in your JavaScript... */
function showStatus() { 
     $('.status-loading').show();
}

function hideStatus() { 
     $('.status-loading').hide();
}

现在,您可以在保存项目时使用这些方法。首先,显示状态消息;然后尝试保存该项目;当它成功时,隐藏它。因此:

showStatus();
myGroup.save(null, {
    success: function(object) {
        hideStatus();
    }
});

对于奖励积分,在这种情况下,您甚至不需要在保存通话中使用匿名功能。因为它唯一要做的就是调用hideStatus,你可以告诉save直接成功调用hideStatus

myGroup.save(null, {success: hideStatus});

最后,您收到的错误消息 - .then不是函数 - 意味着.save方法返回的内容不是Promise。 Parse promises have a .then function,但无论返回什么,都没有这个功能。我不确定,但the Parse documentation for .save没有列出一个单参数的方法来调用它。所以你可以试试这个,传入空选项:

myGroup.save(null, {}).then(
    function() { alert("Successful"); }, 
    function() { alert("Failed"); }
);