2016-11-02 47 views
5

Nodejs'de sunucu kodunu yazıyor ve Parse javascript sdk'yi kullanıyoruz. Çoğunlukla çeşitli Parse nesnelerini getirmemiz veya güncellememiz gerekir. Örneğin, bir kullanıcı adı 'Örnek' ile bir kullanıcı alın. Ayrıştırma bulma/kaydetme işlemleri eşzamanlı olarak nasıl yapılır?

function fetchUser(username) 
    { 
     var User = Parse.Object.extend("User"); 
     var query = new Parse.Query("User"); 
     query.equalTo("username",username); 

     query.first({ 
     success: function(results) { 
     console.log("Successfully retrieved " + results.length + " scores."); 
     return results; 
     }, 
     error: function(error) { 
     console.log("Error: " + error.code + " " + error.message); 
     } 
    }); 
    } 

Bu fonksiyon

başka işlevi tarafından adlandırılabilir:

function test() 
{ 
    var user = fetchUser("example"); 
    console.log(user); // would often print undefined 
    return user; 
} 

function top() 
{ 
    // some code 
    var user = test(); 
    //some code 
} 

// and the function top() mmight be called by some other functions 

sorun bulmak/ilk operasyonlar uyumsuz olarak çalışır çünkü tanımsız sonuçlar elde olması nedeniyledir. FetchUser() işlevinin yalnızca bulma/ilk işlem başarılı/tamamlandığında döndüğünden emin olmanın herhangi bir yolu var mı?

+0

neden sadece fetchUser ve test için bir geri arama vermeyin? Daha iyi okunabilir bir koda sahip olmak istiyorsanız, geri aramalar yerine sözler kullanın. – Tobi

+2

Senkronize olmayan işlemleri senkronize yapamazsınız. Javascript ile yapılamaz. Denemeyi bırak. Geri aramalar veya vaatlerle eşzamansız bir şekilde nasıl programlanacağınızı ya da Java gibi engelleme/zincirleme bir ortama geçiş yapmayı öğrenin. Bu işlem, iş parçacığı içinde (bu mimarinin ilişkili özellikleriyle) engelleme/senkronize etme gibi şeyler yapmanıza olanak tanır. – jfriend00

+0

Gerçekten javascript için yeni. Bazen, sadece 'mümkün değil' de yeterince iyi bir cevaptır. Teşekkürler. :) – Paagalpan

cevap

3

NodeJs tek bir iş parçacığıdır, bu nedenle işlemi engellememeliyiz. senin durumunda

sahip Promise kitaplığı (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)

Ör 1 kullanılarak iki seçenek 1. geçen geri arama 2.: geçen geri arama

function fetchUser(username, callback) 
    { 
     var User = Parse.Object.extend("User"); 
     var query = new Parse.Query("User"); 
     query.equalTo("username",username); 

     query.first({ 
     success: function(results) { 
     console.log("Successfully retrieved " + results.length + " scores."); 
     callback(null,results) 
     }, 
     error: function(error) { 
     console.log("Error: " + error.code + " " + error.message); 
     callback(error) 
     } 
    }); 
    } 

Müşteri kodu:

function test() 
    { 
     var user = fetchUser("example", function(error, user){ 
     if(error){ 
      console.error(error) 
     }else { 
      console.log(user) 
     } 
     }); 
} 

Ör 2: Vaat eden kitaplığı kullanma

function fetchUser(username){ 
    return new Promise(function(resolve, reject){ 
     var User = Parse.Object.extend("User"); 
     var query = new Parse.Query("User"); 
     query.equalTo("username",username); 

     query.first({ 
      success: function(results) { 
       console.log("Successfully retrieved " + results.length + " scores."); 
       resolve(results) 
      }, 
      error: function(error) { 
       console.log("Error: " + error.code + " " + error.message); 
       reject(error) 
      } 
     }); 
    }) 
} 

Müşteri kodu:

function test() 
    { 
     fetchUser("example") 
     .then(function(user){ 
      console.log(user) 
     }) 
     .catch(function(error){ 
     console.error(error) 
     }) 
} 
+0

Her iki durumda da ayrıntılı örnekler için teşekkürler. :) – Paagalpan

+0

[Ayrıntı Sorguları] (http://parseplatform.org/Parse-SDK-JS/api/classes/Parse.Query.html#methods_find) bir Ayrıştırma döndürüyor.Promise, neredeyse tamamen Promises/A + uyumludur - bu yüzden başka bir Promise kitaplığında sarmak zorunda kalmazsınız .... – simonberry

4

JavaScript, yapısı gereği eş zamanlıdır. Böyle bir şey için fetchUser() işleve bir geri arama geçmek ve müşteri kodunu yeniden yazmak zorunda:

function fetchUser(username, callback) { 
    // do request and call callback(null, user) on success 
    // or callback(some_error_object) on failure. 
} 

function test(callback) { 
    var onFetched = function(err, user) { 
     console.log(user); 
     callback(err, user); 
    } 
    var user = fetchUser("example", onFetched); 
} 

Ayrıca promises veya generators (ECMAScript 6 beri) yaklaşımları kullanabilirsiniz.

UPD: Bazı API'lar (DB sürücüleri, fs vb.) Bunları bir arada kullanmasına izin verse de, JavaScript'te bir kod yazmanın kötü yolu olarak kabul edilir. JS kodunuzu tek bir iş parçacığında çalıştırdığından, bu iş parçacığını senkronize çağrıları kullanarak engellemek diğer tüm görevleri engeller. Bu nedenle, birkaç istemciyi aynı anda işleyen bir web sunucusu geliştirirseniz ve bazı API'lara eşzamanlı çağrıları kullanmaya karar verirseniz, diğer istemciler beklemede durumdayken bir kerede yalnızca bir istemci sunulur.

+0

Yanıt ve harika örnek için çok teşekkürler. Ve güncelleme gerçekten yardımcı oldu. Teşekkürler Hangi cevabın kabul edileceğine karar veremedim, ancak diğer biriyle birlikte verdiği sözlere de bir örnek verdim. Afedersiniz. – Paagalpan