2015-01-03 110 views
65

我仍然在努力應對承諾,但由於這裏的社區取得了一些進展。如何在返回函數的變量之前等待承諾完成?

我有一個簡單的JS函數查詢Parse數據庫。它應該返回結果數組,但顯然由於查詢的異步性質(因此是承諾),該函數在結果之前返回,給我一個未定義的數組。

我需要做什麼才能使此功能等待承諾的結果?

這裏是我的代碼:

function resultsByName(name) 
{ 
    var Card = Parse.Object.extend("Card"); 
    var query = new Parse.Query(Card); 
    query.equalTo("name", name.toString()); 

    var resultsArray = []; 

    var promise = query.find({ 
       success: function(results) { 
       // results is an array of Parse.Object. 
          console.log(results); 
          //resultsArray = results; 
          return results; 
       }, 

       error: function(error) { 
       // error is an instance of Parse.Error. 
          console.log("Error"); 
       } 
    });       

} 
+1

你也可以考慮使用async/await。自7.6版以來,節點現在支持異步/等待開箱即用 –

回答

29

,而不是返回返回一個承諾的結果陣列resultsArray然後then上調用點 - 這有來電知道函數執行異步I/O的好處。編碼在JavaScript中的併發是基於 - 你可能需要閱讀this question獲得更廣闊的思路:

function resultsByName(name) 
{ 
    var Card = Parse.Object.extend("Card"); 
    var query = new Parse.Query(Card); 
    query.equalTo("name", name.toString()); 

    var resultsArray = []; 

    return query.find({});       

} 

// later 
resultsByName("Some Name").then(function(results){ 
    // access results here by chaining to the returned promise 
}); 

您可以看到使用解析承諾在Parse's own blog post about it查詢更多的例子。

+0

你能告訴我這是什麼支持嗎? IE9支持這個? –

+0

是的,但解析本身大部分都是死的,所以就是@SandrinaPereira。這是解析_cloud_代碼。 –

+0

啊所以這不僅是純粹的JavaScript?我正在尋找一種方法來做到這一點(等待一個功能完成開始另一個),但只有純JavaScript。 –

5

你不想讓函數等待,因爲JavaScript是意在無阻塞。 而是在函數結束時返回promise,然後調用函數可以使用promise來獲得服務器響應。

var promise = query.find(); 
return promise; 

//Or return query.find(); 
+0

您的整個回調函數中的'success:'位已關閉。 –

+0

或更好:'return query.find();'。 – mash

+0

也行。我只是爲了說明的目的而將其留在此處,但將其添加爲評論。 – Trace

2

你實際上並沒有在這裏使用promise。解析讓你使用回調或承諾;你的選擇。

若要使用承諾,請執行下列操作:

query.find().then(function() { 
    console.log("success!"); 
}, function() { 
    console.log("error"); 
}); 

現在,承諾完成後執行的東西,你可以執行它的then()調用內部的承諾回調裏面。到目前爲止,這與常規回調完全相同。

要真正用好承諾的是,當你把它們連,像這樣:

query.find().then(function() { 
    console.log("success!"); 

    return new Parse.Query(Obj).get("sOmE_oBjEcT"); 
}, function() { 
    console.log("error"); 
}).then(function() { 
    console.log("success on second callback!"); 
}, function() { 
    console.log("error on second callback"); 
}); 
+0

結果對象是什麼類型的對象?因爲它似乎不包含我的數組 –

+0

它應該是一個'Parse.Object'的數組。 – mash

0

什麼我需要做的,使該功能等待承諾的結果呢?

使用async/await(NOT ECMA6的一部分,但 適用於Chrome,邊緣,Firefox和Safari自2017年年底,看到canIuse
MDN

async function waitForPromise() { 
     let result = await Promise.resolve('this is a sample promise'); 
    } 

一點題外話:C#是有這已經有幾年了(!)了。