2015-11-25 71 views
0

我有一個使用Angular,Express,Mongo和Node的學習遊戲。我現在正在學習如何使用承諾,所以我可以等到某些事情完成之後再開始其他事情。如何從Q節點承諾返回變量?

現在,我試圖等待,直到數據庫說如果用戶試圖登錄已經有一個帳戶。我成功了,所以如果用戶不存在,.then()將調用將創建用戶的onReject函數。

user有一個主帳戶,可以播放會話。每屆會議期間,他將收到新的player。如果user存在並且試圖登錄並且他的player被記錄,他將收到player回來。如果player不存在,服務器將爲他創建一個。

但是,我與變量logged有問題,即如果用戶有記錄player。在功能findUser的第二行,我創建了一個名爲logged的變量,我試圖將其返回,因此我可以使用onResolve函數。

UserModel.find(
      { username: username, password: password}, 
      findUser).then( 
      onResolve, 
      onReject ); 

在承諾解決

在承諾拒絕

 var onReject = function() { 
      userModel.save(function (err) { 
       if (!err) { 
        //CREATE USER 
        //CREATE USER'S PLAYER 
       } 
      }); 
     }); 

功能findUser

var findUser = function (err, data) { 
    var logged = false; 
    var userSearched = Q.defer(); 
    if (data.length) { //IF USER IS IN DATABASE 
     logged = true; 
     userSearched.resolve(logged); 
    } else { 
     userSearched.reject(logged); 
    } 

    return userSearched.promise; 
}; 

我該如何將承諾中的logged變量返回到我需要的地方?

+0

您不能將'logged'退回到諾言之外。相反,返回承諾並在需要'記錄'的地方使用它。 –

+0

我正在返回userSearched.promise。如何從那裏訪問記錄的值? – Rodmentou

+0

查看jfriend00的回答 –

回答

3

如果您從.then()處理程序返回值,則該值將成爲承諾的已實現值。

var onResolve = function (logged) { 

     if (logged) { 
     //RETURN USER'S PLAYER 
     } else { 
     //CREATE USER'S PLAYER 
     } 
     // ** add this ** 
     return logged; 
    } 

然後,您可以在後續.then()處理程序使用它:

UserModel.find({ username: username, password: password}, findUser) 
    .then(onResolve, onReject) 
    .then(function(result) { 
     // can access result here 
    }); 

如果此代碼是一個函數裏面,那麼你可以從UserModel.find()返回承諾:

function someFunc() { 
    return UserModel.find({ username: username, password: password}, findUser) 
     .then(onResolve, onReject); 

} 

然後,在返回的承諾中添加一個.then()處理程序。

someFunc().then(function(result) { 
    // access result here 
}); 

或者,在findUser()功能:

var findUser = function (err, data) { 
    var userSearched = Q.defer(); 
    if (data.length) { //IF USER IS IN DATABASE 
     userSearched.resolve(true); 
    } else { 
     userSearched.reject(false); 
    } 

    return userSearched.promise; 
}; 

findUser.then(function(val) { 
    // access resolved value here 
}, function(err) { 
    // access rejected reason here 
}); 

雖然,findUser()不看異步,所以我真的不明白,爲什麼您使用的是與承諾它在所有。看來你可以直接從函數中返回truefalse

+0

感謝您快速,完整的回答。我正在嘗試。 ;) – Rodmentou