2015-06-18 99 views
0

我理解分析承諾背後的理論(.then,.done,.when等),但我不知道如何執行它們。目前,我正在使用警報來迫使系統等待足夠長的時間以履行承諾,但那是一種非常粗糙的做法。我將發佈的代碼完全符合我的要求。它創建一個表格,從數據庫收集信息,並將其格式化到表格中。如果我拿出戒備(「迫使等待」);它不會工作,因爲承諾還沒有實現。我應該在哪裏以及如何添加一些承諾處理程序以使其在沒有警報的情況下工作?我嘗試將for循環更改爲do,然後添加。然後,但我無法讓它不拋出錯誤,但是我很確定這是因爲我格式化了錯誤的結構。任何幫助將不勝感激。謝謝!執行分析承諾

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); 
     }); 
}); 
+0

你從哪裏運行'billingReport'?它與'runReport'在同一個文件中嗎?從其他地方調用runReport嗎?就像從Parse以外的應用或網站一樣? – MayNotBe

回答

0

我可能是錯的,但Parse.Cloud.run("caseHelper",可能會引起問題,所有這些都在異步運行,而不2可能的alert結果提前1結果並搞砸table.insertRow(i),也不知道[i-1]業務背後的原因,因爲至少對於我的價值0,它不會工作。

我會建議你使用Promise.when並等待所有承諾插入行之前完成:

function billingReport(){ 
    var sDate = new Date(document.getElementById("startDate").value); 
    var table = document.getElementById("results1"); 
    var row, cell1, cell2, cell3, cell4, scores; 
    var tableHeaderRowCount = 1; 
    var rowCount = table.rows.length; 
    for (var i = tableHeaderRowCount; i < rowCount; i++) { 
     table.deleteRow(tableHeaderRowCount); 
    } 
    Parse.Cloud.run("runReport", {sDate: sDate}).then(function(data){ 
     scores = data; 
     console.log("Successfully retrieved " + scores.length + " scores."); 
     return Parse.Promise.when(scores.map(function(score){ 
      return Parse.Cloud.run("caseHelper", {id: score.attributes.customer.id, className: "User", attribute: "username"}); 
     })); 
    }).then(function(results){ 
     for(var i = 0; i < scores.length; i++){ 
      row = table.insertRow(i);  
      cell1 = row.insertCell(0); 
      cell2 = row.insertCell(1); 
      cell3 = row.insertCell(2); 
      cell4 = row.insertCell(3); 
      cell1.innerHTML = scores[i].id; 
      cell2.innerHTML = scores[i].attributes.title; 
      cell3.innerHTML = scores[i].attributes.hoursWorked; 
      cell4.innerHTML = results[i];      
     } 
    }).fail(function(err){ 
     console.log("Error creating report :" + err); 
    }); 
} 
+0

我相信這是i-1業務,因爲我沒有正確處理異步。這是我能夠正確檢索所有項目的唯一方法,即使邏輯沒有意義。我想,當它檢索到i時,它已經增加了,所以我必須減少1來抵消這個值。我會執行你的修復,看看會發生什麼,我會讓你知道結果。 –

+0

它現在沒有警報,所以在技術上你的答案是正確的,但它並不完全符合預期。 caseHelper返回單個字符串值,而不是數組。所以結果[i]只是返回字符串的第一個字母。將其更改爲只是結果會給出整個字符串,但每次都是相同的字符串。我認爲解決這個問題的最簡單方法是改變案例Helper去推出一個數組而不是單個字符串值,然後結果[i]可以正常工作 –