我的初始代码:
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的内容但却无法真正得到它。
答案 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"); }
);