如何使 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"); }
);