繁体   English   中英

通过url和httpRequest解析云代码循环

[英]Parse cloud code loop through url and httpRequest

我只想在我的“警报”对象中做一个简单的循环,其中包含一个URL和一个单词。 对于每个警报,我都执行一个httpRequest来检查响应html代码中是否存在该单词。 是的,我将状态定为真实。

我也想每次在“ updatedTo”列中进行更新,即使我在响应html代码中找不到该单词,但我也不知道为什么...

我写了这个云代码,但是它不起作用,或者有时只有当我只有带有单词的项目时,它才起作用。

    Parse.Cloud.job("updateStatus", function(request, status) {
    Parse.Cloud.useMasterKey();
    var counter = 0;
    var AlertItem = Parse.Object.extend("Alert");
    var query = new Parse.Query(AlertItem);
    query.each(function(alert) {
            var alertTitle = alert.get("title");
            var alertUrl = alert.get("url");
            var alertStatus = alert.get("status");
            var alertWords = alert.get("research");
            console.log("Alert : " + alertTitle + " - Check if : " + alertWords + " is on : " + alertUrl)

            promise = promise.then(function() {
                    return Parse.Cloud.httpRequest({
                        url: alertUrl,
                        headers: {
                            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25'
                        },
                    }).then(function(httpResponse) {
                            console.log("We succeded to access to the website");
                            var htmlCode = httpResponse.text;
                            if (htmlCode.indexOf(alertWords) >= 0) {
                                if (alertStatus == false) {
                                    alert.set("status", true);
                                    console.log("new status:true");
                                    return alert.save();
                                }
                            } else {
                                alert.set("status", false);
                                console.log("new status:false");
                                //I do this to updated the "updatedTo" field, but it doesn't work
                                return alert.save();
                            }
                            // You need to return a Promise here if non of the above condition meet.
                        },
                        function(error) {
                            console.error('Request failed with response code ' + httpResponse.headers.Location);
                            // You need to return a rejected promise here.
                        }
                    });
            });
        return promise;
    }).then(function() {
    status.success('Status updated');
    // Set the job's success status
}, function(error) {
    // Set the job's error status
    status.error("Uh oh, something went wrong.");
});
});

文档中的query.each(回调,选项)。

遍历查询的每个结果,为每个查询调用一个回调。 如果回调函数返回了一个Promise,则直到该Promise满足,迭代才会继续。 如果回调返回被拒绝的承诺,则迭代将因该错误而停止。 这些项目将以未指定的顺序处理。 该查询可能没有任何排序顺序,并且可能不使用限制或跳过。

Parse.Cloud.job("updateStatus", function(request, status) {
    Parse.Cloud.useMasterKey();
    var counter = 0;
    var AlertItem = Parse.Object.extend("Alert");
    var query = new Parse.Query(AlertItem);
    query.each(function(alert) {
        var alertTitle = alert.get("title");
        var alertUrl = alert.get("url");
        var alertStatus = alert.get("status");
        var alertWords = alert.get("research");
        console.log("Alert : " + alertTitle + " - Check if : " + alertWords + " is on : " + alertUrl)


        return Parse.Cloud.httpRequest({
            url: alertUrl,
            headers: {
                'user-agent': 'A user classic agent'
            },
            success: function(httpResponse) {
                console.log("We succeded to access to the website");
                var htmlCode = httpResponse.text;
                if (htmlCode.indexOf(alertWords) >= 0) {
                    if (alertStatus == false) {
                        alert.set("status", true);
                        console.log("new status:true");
                        return alert.save();
                    }
                } else {
                    alert.set("status", false);
                    console.log("new status:false");
                    //I do this to updated the "updatedTo" field, but it doesn't work
                    return alert.save();
                }
                // You need to return a Promise here if non of the above condition meet.
            },
            error: function(httpResponse) {
                console.error('Request failed with response code ' + httpResponse.headers.Location);
                // You need to return a rejected promise here.
            }
        });
    }).then(function() {
        status.success('Status updated');
        // Set the job's success status
    }, function(error) {
        // Set the job's error status
        status.error("Uh oh, something went wrong.");
    });
});

因此,在任何帮助下都很难,但是我最终找到了另一个与我需要的贴近的职位,我对其进行了调整,然后我成功使用了它,它与Promises一起使用非常有用:):

var _ = require('underscore.js')

Parse.Cloud.job("updateStatus", function(request, response) {

var alerts = Parse.Object.extend("Alert");
var query = new Parse.Query(alerts);
query.equalTo("status", false);

query.find().then(function(alerts) {

    var promise = Parse.Promise.as();

    _.each(alerts, function(alert) {

        var alertUrl = alert.get("url");
        ...

        promise = promise.then(function() {
            return Parse.Cloud.httpRequest({
                url: alertUrl
                }).then(function(httpResponse) {
                    ...
                }, 
                function(error) {
                    ...
                });
            });
    });

    return promise;

}).then(function() {
    response.success("All status updated with success !");
}, 
function (error) {
    response.error("Error: " + error.code + " " + error.message);
});
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM