簡體   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