2017-02-03 66 views
0

我現在有這樣的返回的NodeJS真/假內部功能

function userExists(userID) { 
    connection.query(query, function(error, results, fields) { 
     if(results.length > 0) { 
      return true; 
     } 
     return false; 
    }); 
} 

我的意圖的代碼是,如果結果被發現有這種回報爲真,假,如果它沒有。這不起作用,因爲返回一個函數內部的功能,我將如何解決這個問題,所以我仍然可以這樣做if(userExists(id)) { code }

+1

恐怕這不能在簡單的JS中完成,因爲'connection.query'可能需要一些時間來處理,所以'userExists()'函數應該被阻塞。但JS不支持任何阻塞操作,afaik。所以你應該讓'userExists'接受回調並採用異步風格。 – yeputons

+1

[如何使一個函數等待,直到使用node.js調用回調](http://stackoverflow.com/questions/5010288/how-to-make-a-function-wait-until-a -callback-has-called-using-node-js) – yeputons

+1

可能的重複[如何從異步調用返回響應?](http://stackoverflow.com/questions/14220321/how-do-i -return-the-an-asynchronous-call) –

回答

1

您將需要使用Promise或回調函數..下面是一個示例如何實現使用承諾的功能:

function userExists(userID) { 
    return new Promise(function(resolve, reject) { 
     connection.query(query, function(error, results, fields) { 
      resolve(results.length > 0); 
     }); 
    } 
} 


userExists(1).then(function(result) { 
    // Here result will be either true or false. 
} 

你也許可以使用ES6語法,如果你正在運行的節點,所以你也可以寫

const userExists = userID => new Promise((resolve, reject) => { 
    connection.query(query, (error, results, fields) => { 
     resolve(results.length > 0); 
    }); 
}); 

userExists(1).then(result => { 
    console.log(result); 
}); 

編輯:

如果你出於某種原因需要使用回調函數來實現這個功能,那麼你應該如何去做。儘管使用Promise是首選。

const userExists = (id, callback) => { 
    connection.query(query, (error, results, fields) => { 
     callback(results.length > 0); 
    }); 
} 

userExists(1, result => { 
    console.log(result); 
}); 
+0

嘿,男士,謝謝你,這正是我正在尋找的東西,我修正了ES6版本,但有一個缺失)和一個額外的}。 –

+0

@JohnsonD​​oe謝謝。我還添加了一個示例,如果您有興趣,您將如何使用回調函數來執行此操作。 – Mico