执行解析承诺

时间:2015-06-18 14:04:07

标签: javascript parse-platform promise

我理解解析承诺背后的理论(.then,.done,.when等),但我不知道如何执行它们。目前我正在使用警报来强制系统等待足够长的时间来履行承诺,但这是一种非常粗暴的做法。我将发布的代码完全符合我的要求。它创建一个表,从数据库中收集信息,并将其格式化到表中。如果我拿出警报(“强迫等待”);它不会工作,因为承诺还没有完成。我应该在哪里以及应该添加一些承诺处理程序,以使其在没有警报的情况下工作?我尝试将for循环更改为do while,并添加.then但我无法让它不抛出错误,但我很确定这是因为我格式化结构错误。任何帮助将不胜感激。谢谢!

function billingReport(){
    var sDate = new Date(document.getElementById("startDate").value);
    var table = document.getElementById("results1"); 
    var row, cell1, cell2, cell3, cell4; 
    var tableHeaderRowCount = 1;
    var rowCount = table.rows.length;
    for (var i = tableHeaderRowCount; i < rowCount; i++) {
        table.deleteRow(tableHeaderRowCount);
    }
    Parse.Cloud.run("runReport", {sDate: sDate}, {
        success: function(result){
            alert("Successfully retrieved " + result.length + " scores.");
            for(var i = 0; i < result.length; i++){ 
                alert("forces a wait");
                Parse.Cloud.run("caseHelper", {id: result[i].attributes.customer.id, className: "User", attribute: "username"},{
                    success: function(results){
                        row = table.insertRow(i);     
                        cell1 = row.insertCell(0);
                        cell2 = row.insertCell(1);
                        cell3 = row.insertCell(2);
                        cell4 = row.insertCell(3);  
                        cell1.innerHTML = result[i-1].id;
                        cell2.innerHTML = result[i-1].attributes.title;
                        cell3.innerHTML = result[i-1].attributes.hoursWorked;
                        cell4.innerHTML = results;
                    },
                    error: function(error){
                        alert("Error gathering customer information: " + error.code + " - " + error.message);
                    }
                });
                }
        },
        error: function(error){
            alert("Error creating report :" + error.code + " - " + error.message);
        }
    });
} 

以下是此功能的云代码:

Parse.Cloud.define("runReport", function(request, response) {
    var sDate = request.params.sDate;
    var caseList = Parse.Object.extend("Cases");
    var query = new Parse.Query(caseList);
    query.equalTo("status", "closed");
    query.greaterThanOrEqualTo("createdAt", new Date(sDate.toISOString()));
    query.find({
        success: function(results){
            var q = results;
            response.success(q);
        },
        error: function(error){
            response.error("Failed to create query for report.");
        }
    })
});

Parse.Cloud.define("caseHelper", function(request, response) {
    var id = request.params.id;
    var className = request.params.className;
    var attribute = request.params.attribute;
    var list = Parse.Object.extend(String(className));
    var query = new Parse.Query(String(className));
    query.equalTo("objectId", id);
    query.first().done(function(result){
        var a = result.get(attribute);
        response.success(a);
        });
});

1 个答案:

答案 0 :(得分:0)

我可能错了,但Parse.Cloud.run("caseHelper",可能导致问题,所有这些都是在异步中运行,没有alert结果2可能先于1的结果并且搞砸了{{ 1}},也不确定table.insertRow(i)业务背后的原因,因为至少对于i值0,它不会工作。

我建议您使用[i-1]并在插入行之前等待所有承诺完成:

Promise.when