parse-platform - 解析云: Query not running in exported function from save() callback

标签 parse-platform parse-cloud-code

我使用 Parse 来表示啤 cask 的状态(除其他外)。我想检查存储在“通知”表中的用户通知,看看他们是否愿意在小桶装满时收到通知。

我拥有用于​​设置用户通知设置以及在 cloud/notifications.js 中发送通知的所有逻辑。更新小桶的所有逻辑都在 cloud/beer.js 中。我创建了一个名为“sendKegRefillNotification”的导出函数,它在通知表上执行 query.find() 并从 beer.js 调用。

问题是,当我从 beer.js 调用该函数时,它似乎没有执行 query.find(),但是当我从 notification.js 中的作业调用相同的函数时,它工作得很好。

main.js:

require("cloud/beer.js");
require("cloud/notifications.js");

啤酒.js:

var notify = require("cloud/notifications.js");

var Keg = Parse.Object.extend("Keg");

var fillKeg = function(beerName) {
    var promise = new Parse.Promise();

    var keg = new Keg();
    keg.set("beerName", beerName)
    keg.set("kickedReports", []);
    keg.save(null, { useMasterKey: true }).then(function(keg) {
        console.log("Keg updated to " + beerName + ".");
        promise.resolve(keg);
        notify.sendKegRefillNotification(keg);
    },
    function(keg, error) {
        promise.reject(error);
    });

    return promise;
}

Parse.Cloud.define("beerFillKeg", function(request, response) {
    var beerName = request.params.name;
    if (!beerName) {
        response.error("No beer was specified.");
        return;
    }
    if (!util.isUserAdmin(request.user)) {
        response.error("User does not have permission to update the keg.");
        return;
    }
    fillKeg(beerName).then(function(keg) {
        kegResponse(keg).then(function(result) {
            response.success(result);
        });
    },
    function(error) {
        response.error(error);
    });
});

function kegResponse(keg) {
    var promise = new Parse.Promise();

    var result = {
        id: keg.id,
        beer: {
            name: keg.get("beerName")
        },
        filled: keg.createdAt,
        kickedReports: []
    };

    var kickedReports = keg.get("kickedReports");
    if (!kickedReports || kickedReports.length == 0) {
        promise.resolve(result);
    } else {
        util.findUsers(kickedReports).then(function(users) {
            result.kickedReports = util.infoForUsers(users);
            promise.resolve(result);
        }, function(users, error) {
            console.log(error);
            promise.resolve(result);
        });
    }
    return promise;
}

通知.js:

var Keg = Parse.Object.extend("Keg");
var Notification = Parse.Object.extend("Notifications");

exports.sendKegRefillNotification = function(keg) {
    var beerName = keg.get("beerName");
    console.log("Sending notifications that keg is refilled to '" + beerName + "'.");

    var promise = new Parse.Promise();

    var query = new Parse.Query(Notification);
    query.include("user");
    query.equalTo("keg_filled", true);
    query.find({ useMasterKey: true }).then(function(notifications) {
        console.log("Found notifications!");
        promise.resolve("Found notifications!");
    },
    function(notifications, error) {
        console.error("No notifications");
        console.error(error);
        promise.reject(error);
    });

    return promise;
}

Parse.Cloud.job("beerSendRefillNotification", function(request, status) {
    var query = new Parse.Query(Keg);
    query.descending("createdAt");
    query.first().then(function(keg) {
        if (!keg) {
            status.error("No keg");
            return;
        }

        exports.sendKegRefillNotification(keg);
    },
    function(keg, error) {
        response.error(error);
    });
});

当我从 Parse 仪表板运行作业“beerSendRefillNotification”时,我可以知道 query.find() 正在被调用,因为它打印“找到通知!”:

E2015-02-23T06:59:49.006Z]v1564 Ran job beerSendRefillNotification with:
  Input: {}
  Result: success/error was not called
I2015-02-23T06:59:49.055Z]false
I2015-02-23T06:59:49.190Z]Sending notifications that keg is refilled to 'test'.
I2015-02-23T06:59:49.243Z]Found notifications!

但是,当我调用云函数“beerFillKeg”时,并不是因为它没有打印“发现通知!”或“无通知”:

I2015-02-23T07:00:17.414Z]v1564 Ran cloud function beerFillKeg for user HKePOEWZvC with:
  Input: {"name":"Duff"}
  Result: {"beer":{"name":"Duff"},"filled":{"__type":"Date","iso":"2015-02-23T07:00:17.485Z"},"id":"olLXh0F54E","kickedReports":[]}
I2015-02-23T07:00:17.438Z]false
I2015-02-23T07:00:17.523Z]Keg updated to Duff.
I2015-02-23T07:00:17.525Z]Sending notifications that keg is refilled to 'Duff'.

最佳答案

我终于明白了。在 sendKegRefillNotification 中,您调用 query.find({...}),然后返回一个对象。 find 是异步的,您无需执行任何操作即可等待结果。我认为您需要返回 find 函数调用,而不是您在该方法中设置的对象。

换句话说,您正在运行,留下一些异步运行代码。

编辑:我明白你想做什么。这有点道理。您定义了一个 promise ,并认为调用者会等待该 promise 。问题是,promise 是在异步 block 中定义的。当调用者得到它时,它还没有任何意义。

关于parse-platform - 解析云: Query not running in exported function from save() callback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28668659/

相关文章:

android - 如何在parse.com中获取插入行的objectId

android - 在 Parse 中,从本地数据存储中取消固定对象是否也会删除它们指向的对象?

swift - Swift 中的 Parse.com 数组到 NSMutableArray

javascript - Parse.com 云代码访问查询结果中的用户对象为 null

android - 解析中的 emailVerification = false

javascript - 将 Parse.com 与 Polymer 结合使用

javascript - 使用云代码解析服务器保存 jpg 文件

javascript - Parse.Query 和组合问题

javascript - 解析预定的后台作业

javascript - 如何在 Parse 云代码上安装外部 javascript 库