如何使 Parse 中的保存功能以同步方式工作
How to make the save function in Parse work in synchronous manner
我的初始代码:
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");
所以输出:
由于异步性质,现在首先打印 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(...).then 不是函数 但是组对象被添加到 Parse 我不知道为什么?为什么我会收到此错误消息?
所以,我在 Whosebug 和 google 上进行了搜索,但找不到对我有用的东西。真的,我对这种异步的东西很陌生。我想让这个保存功能作为同步工作,我已经阅读了 Promise 的东西但无法真正理解它。
Promises 不允许您将异步代码转换为同步代码。它们是构建异步代码的另一种方式——一种通常更容易理解复杂链的方式。但是您发布的两个代码示例实际上是等效的。
几乎没有任何理由让您的 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, but whatever is being returned doesn't have that function. I'm not sure, but the Parse documentation for .save
没有列出调用它的单参数方式。所以你可以试试这个,传递空选项:
myGroup.save(null, {}).then(
function() { alert("Successful"); },
function() { alert("Failed"); }
);
我的初始代码:
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");
所以输出: 由于异步性质,现在首先打印 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(...).then 不是函数 但是组对象被添加到 Parse 我不知道为什么?为什么我会收到此错误消息?
所以,我在 Whosebug 和 google 上进行了搜索,但找不到对我有用的东西。真的,我对这种异步的东西很陌生。我想让这个保存功能作为同步工作,我已经阅读了 Promise 的东西但无法真正理解它。
Promises 不允许您将异步代码转换为同步代码。它们是构建异步代码的另一种方式——一种通常更容易理解复杂链的方式。但是您发布的两个代码示例实际上是等效的。
几乎没有任何理由让您的 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, but whatever is being returned doesn't have that function. I'm not sure, but the Parse documentation for .save
没有列出调用它的单参数方式。所以你可以试试这个,传递空选项:
myGroup.save(null, {}).then(
function() { alert("Successful"); },
function() { alert("Failed"); }
);