2017-09-24 50 views
1

我有以下輔助函數從使用promise的函數中返回布爾值?

userExist(email) { 
    this.findUserByEmail(email).then(result => { 
     return true; 
    }).catch(error => { 
     return false; 
    }); 

    } 

然後我在不同的文件中稱此:

var stuff = userService.userExist('abc') 
console.log(stuff); 

但東西總是不確定的,因爲該功能是一種承諾,我怎麼能等待這個值我的幫助函數返回true或false

回答

1

使用then方法附加一個回調,一旦約定解決就會調用:

userService.userExist('abc').then(stuff => { 
    console.log(stuff); 
}) 
+0

有沒有辦法做到這一點,而沒有使這個可行?我只是想用它作爲幫助函數 – Beto

+0

另外,別忘了在'userExist'中返回承諾 – gretro

2

不具備Thenable在大多數情況下是不可能的。承諾是代表異步工作的對象。如果你等待這個工作等待完成,所有東西都會被凍結,因爲JS通常運行在單線程的環境中。

如果您想在一個環境中編碼異步內容的同步編程,請嘗試async/await語法。我很喜歡。基本上,它應該是這樣的:

async function checkUserExists() { 
    const exists = await userService.userExists('abc') 
    console.log('Exists', exists) 
} 

你需要認識到,承諾仍然引擎蓋下使用。現在Babel和Typescript都支持這種語法,以便與ES5向後兼容。根據節點,它自7.6起支持。

+0

這個語法不會使用[generators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generators),只有[promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)。請不要在你的回答中誤導你。 –

+0

Babel實現在轉譯時使用它們。原諒我的困惑。 – gretro

+0

由於用戶自身的限制,它並不是出於便利性和必要性,而不是因爲規範的規定。它看起來類似於生成器函數,但在v8和其他引擎中,生成器函數不用於實現異步函數。 –