2016-12-31 71 views
-1
return User.findOne({email: email}).then((user) => { 
    return user; }); 

然後如何工作?當我做return user在NodeJS上調用一個承諾的結果函數

請問整體User.findOne({email: email}) ------> user?第一個語句是否轉換爲返回用戶的函數,所以你在做:

return user; 

最後呢?

當你做。然後,並返回的東西,實際承諾(第一)聲明會發生什麼? (然後之前的整個聲明)?

+0

你使用庫來查詢你的數據庫?我不記得'.findOne'返回一個承諾。 –

+0

@DanielB,Mongoose – user7361048

回答

1

看着貓鼬的文件,在你的代碼中使用不返回諾言.findOne()但具有.then()功能產生從異步操作的值query。要獲得真正的承諾,您必須改用.exec(),因爲可以讀取here

整個User.findOne({email: email}) ------> user?左側的 聲明是否成爲用戶,因此您在做:return user;到底?

不。實際上,整個.then((user) => { return user; });部分是多餘的。 .findOne(...)可以通過返回像

return User.findOne({email: email});然後訪問後面的查詢.then()的價值。爲了說明這一點,看看這個fiddle,它展示了同樣的事情,但有真正的承諾。

當你做.then,並返回的東西,會發生什麼實際 承諾聲明? (之前的整個陳述)?

沒有。如果您有真實承諾,它們要麼正在等待,要麼完成,要麼被拒絕。 .then()函數返回一個新的承諾也被拒絕或履行。當您返回從.then()函數裏面的東西,返回值實際上是解決了,這意味着它有效地返回Promise.resolve(<value>).

+0

因此,當我調用。然後在User.findOne上,然後不返回User.findOne({電子郵件:電子郵件}),它有什麼作用?它會返回undefined嗎?如果我有一個函數function exe(){User.findOne({email:email})。then((result)=> {return result;})}',並且執行'exe()',返回什麼? – user7361048

+0

由於您沒有執行'{返回User.findOne(..)}',所以會返回'undefined'。如果你看我的小提琴,你會注意到根本不需要添加'.then()',而是應該將函數定義爲'function exe(){return User.findOne({email:電子郵件}); }' –

+0

'函數f(){ 返回函數g(){ return「ggggg」; } } console.log(f());'爲什麼這會返回'[Function:g]'?而不是'ggggg' – user7361048

0

據我所知道的,.then功能在技術上是過時的貓鼬 - 你想用的你自己實施的承諾。

那說,看起來像貓鼬一直使用mpromise,因爲它的承諾的實施,以及.then功能實現here

Promise.prototype.then = function (onFulfill, onReject) { 
    var newPromise = new Promise; 

    if ('function' == typeof onFulfill) { 
    this.onFulfill(handler(newPromise, onFulfill)); 
    } else { 
    this.onFulfill(newPromise.fulfill.bind(newPromise)); 
    } 

    if ('function' == typeof onReject) { 
    this.onReject(handler(newPromise, onReject)); 
    } else { 
    this.onReject(newPromise.reject.bind(newPromise)); 
    } 

    return newPromise; 
}; 

.then剛剛鏈的新承諾,先前承諾的執行。實際上,你有兩個承諾,一個接一個地執行。