如何使parsing查找/保存操作同步?

我们在nodejs中编写服务器代码并使用Parse javascript sdk。 通常我们需要获取或更新各种Parse对象。 例如,获取用户名为“示例”的用户。

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

这个函数可能被其他函数调用:

 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 

问题是我会得到未定义的结果,因为查找/第一个操作asynchronous运行。 有没有什么办法可以确保fetchUser()函数只在find / first操作成功/完成时才返回?

NodeJs是单线程的,所以我们不应该阻塞进程。

在你的情况你有两个选项1.传递callback2.使用Promise库( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

例1:传递callback

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

客户代码:

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

例2:使用有希望的库

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

客户代码:

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

JavaScript本质上是asynchronous的。 您必须将callback传递给fetchUser()函数,并将您的客户端代码重写为如下所示:

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

也可以使用承诺或生成器 (因为EcmaScript 6)接近。

UPD:尽pipe一些API(DB驱动程序,fs等)允许以同步方式使用它们,但是在JavaScript中编写代码被认为是不好的方法。 由于JS在一个线程中运行你的代码,通过使用同步调用来阻塞这个线程将会阻塞所有其他的任务。 因此,如果您开发一个同时处理less数几个客户端的Web服务器,并决定对某些API使用同步调用,则一次只能为一个客户端提供服务,而其他客户端则处于未决状态。