Javascript 解析服务器云代码后台作业查询和更新对象

Javascript 解析服务器云代码后台作业查询和更新对象,javascript,parse-server,parse-cloud-code,Javascript,Parse Server,Parse Cloud Code,我有一个Parse Server应用程序托管在back4app上,我正在运行一个后台作业,每分钟运行一次,并查询字母类,其中列deliveryDate小于或等于当前日期,下面是我的main.js文件: // DELIVER A LETTER Parse.Cloud.job("deliverLetter", function (request, status) { var now = new Date(); // var nowTime = date.getTime();

我有一个Parse Server应用程序托管在back4app上,我正在运行一个后台作业,每分钟运行一次,并查询
字母
类,其中列
deliveryDate
小于或等于当前日期,下面是我的main.js文件:

// DELIVER A LETTER
Parse.Cloud.job("deliverLetter", function (request, status) {
    var now = new Date();
    // var nowTime = date.getTime();

    var Letters = Parse.Object.extend("Letters");
    var query = new Parse.Query(Letters);
    query.lessThanOrEqualTo("deliveryDate", now);
    query.find().then (function (objects) {
        objects.forEach(function (obj) {
            obj.set("isDelivered", true);

            Parse.Cloud.useMasterKey();
            obj.save(null, { useMasterKey: true } ).then(function(obj) {
                response.success(obj);
            }, function(error) {
                response.error(error)
            });
    });
});
例如,我在Letters类中保存了一行,其中
deliveryDate
设置为昨天,以便测试这个云代码函数。还有一列名为
isDelivered
,它被设置为False。因此,我上面的函数应该将
isDelivered
设置为True,并更新我的
字母的对象

但它不起作用,所以我不知道我做错了什么

编辑 多亏了
danh
,我将代码修复如下:

var Letters = Parse.Object.extend("Letters");
    var query = new Parse.Query(Letters);
    query.lessThanOrEqualTo("deliveryDate", now);
    query.equalTo("isDelivered", false);

    query.find().then (function (objects) {
        let savePromises = objects.map(function (obj) {
            obj.set("isDelivered", true);
            return obj.save(null, { useMasterKey: true } );
        });
        Promise.all(savePromises).then(function(obj) {
            response.success(obj);
        }, function(error) {
            response.error(error)
        });
    });
我需要从main.js文件调用另一个函数,该函数发送推送通知并需要一些参数。我通常从我的应用程序中调用它,我将如何从上述函数中调用它

Parse.Cloud.define("pushiOS", function(request, response) {

  var user = request.user;
  var params = request.params;
  var userObjectID = params.userObjectID
  var data = params.data

  var recipientUser = new Parse.User();
  recipientUser.id = userObjectID;

  var pushQuery = new Parse.Query(Parse.Installation);
  pushQuery.equalTo("userID", userObjectID);

  Parse.Push.send({
    where: pushQuery,
    data: data
  }, { success: function() {
      console.log("#### PUSH SENT!");
  }, error: function(error) {
      console.log("#### PUSH ERROR: " + error.message);
  }, useMasterKey: true});
  response.success('success');
});
也许会变成承诺。好吗

调用
response.success()
时,任何正在进行或尚未启动的
save()
都将被终止(或没有机会启动)。若要修复,请收集所有保存的承诺,并将它们与
Promise.all()
一起运行,只有在传递给它的所有承诺都已解决后,它才会进行解析

query.find().then (function (objects) {
    // Parse.Cloud.useMasterKey(); don't need this
    let savePromises = objects.map(function (obj) {
        obj.set("isDelivered", true);
        return obj.save(null, { useMasterKey: true } );
    });
    Promise.all(savePromises).then(function(obj) {
        response.success(obj);
    }, function(error) {
        response.error(error)
    });
});
另外,顺便注意,
query.lessThanOrEqualTo(“deliveryDate”,现在)
将获取之前具有deliveryDates的所有对象,包括您以前处理的对象。随着时间的推移,该结果将单调地变长,最终超过运行间隔1分钟,或者耗尽一些其他系统资源

也许你真的想要

query.lessThanOrEqualTo("deliveryDate", now);
query.equalTo("isDelivered", false);
编辑

第二个问题可以通过分解像这样的承诺返回推函数来解决

function pushDataToUser(userID, data)
    var recipientUser = new Parse.User();
    recipientUser.id = userID;
    let pushQuery = new Parse.Query(Parse.Installation);
    pushQuery.equalTo("userID", userID);
    return Parse.Push.send({ where:pushQuery, data:data });
}
Parse.Cloud.define("pushiOS", function(request, response) {
    let params = request.params;
    pushDataToUser(params.userObjectID, params.data).then(function() {
        console.log("#### PUSH SENT!");
        response.success('success');
    }, function(error) {
        console.log("#### PUSH ERROR! " + JSON.stringify(error));
        response.error(error);
    });
}
// function doSomething() returns a promise (like from a find() or a save()
return doSomething().then(function() {
    // initialize someId and someData
    return pushDataToUser(someId, someData)
});
可以从云代码中调用,如下所示

function pushDataToUser(userID, data)
    var recipientUser = new Parse.User();
    recipientUser.id = userID;
    let pushQuery = new Parse.Query(Parse.Installation);
    pushQuery.equalTo("userID", userID);
    return Parse.Push.send({ where:pushQuery, data:data });
}
Parse.Cloud.define("pushiOS", function(request, response) {
    let params = request.params;
    pushDataToUser(params.userObjectID, params.data).then(function() {
        console.log("#### PUSH SENT!");
        response.success('success');
    }, function(error) {
        console.log("#### PUSH ERROR! " + JSON.stringify(error));
        response.error(error);
    });
}
// function doSomething() returns a promise (like from a find() or a save()
return doSomething().then(function() {
    // initialize someId and someData
    return pushDataToUser(someId, someData)
});
…新的承诺返回函数可以添加到任何其他承诺链中,如

function pushDataToUser(userID, data)
    var recipientUser = new Parse.User();
    recipientUser.id = userID;
    let pushQuery = new Parse.Query(Parse.Installation);
    pushQuery.equalTo("userID", userID);
    return Parse.Push.send({ where:pushQuery, data:data });
}
Parse.Cloud.define("pushiOS", function(request, response) {
    let params = request.params;
    pushDataToUser(params.userObjectID, params.data).then(function() {
        console.log("#### PUSH SENT!");
        response.success('success');
    }, function(error) {
        console.log("#### PUSH ERROR! " + JSON.stringify(error));
        response.error(error);
    });
}
// function doSomething() returns a promise (like from a find() or a save()
return doSomething().then(function() {
    // initialize someId and someData
    return pushDataToUser(someId, someData)
});

非常感谢你的回答,什么是“承诺”?也许你的意思是“信”?:-)承诺是你发送给
然后
的对象。Query.find和Object.save这两个返回承诺。还有Promise.all()运行一组。我明白了,我不知道,谢谢,我现在就试试你的代码;)当然这是一个特定于解析的文档。。。这是我最喜欢的JS的一部分,它使异步编程变得如此简单。还有一种更为现代的语法叫async await,您也应该查看它。再次感谢您,它非常有用,我已经编辑了我的问题,希望您也能帮助我解决一个新问题;)不管怎样,我已经接受了你的回答。