2016-02-19 54 views
-1

我有兩個功能。從數據庫中獲取一個用戶,並通過他們的另一個循環,並顯示它們作爲一個列表:如何返回嵌套承諾的結果?

store.findUsers =() => { 
    function map (doc, emit) { 
    if (doc.type === 'user') { 
     emit(doc.createdAt) 
    } 
    } 
    return db.query(map, {include_docs: true}).then(posts => 
    _.map(posts.rows, (post) => post.doc) 
) 
} 

store.getUserList =() => { 
    store.findUsers().then(posts => { 
    return _.map(posts, (post) => post) 
    }).then(result => { 
    return result 
    }) 
} 

我使用的功能是這樣的:

var userList = store.getUserList() 
console.log('User list:', userList) 

然而,console.log('User list:', userList)不輸出任何東西。我認爲這是因爲store.getUserList()中的return result在嵌套承諾中。

如何修改代碼返回result

回答

2

不要返回它;這不是承諾如何工作,並且幾乎會打敗他們的目的。修改您的函數,以便它返回一個承諾:

store.getUserList =() => { 
    return store.findUsers().then(posts => { 
    return _.map(posts, (post) => post) 
    }).then(result => { 
    return result 
    }) 
} 

,然後使用該承諾只要您撥打您的功能:

store.getUserList().then(userList => { 
    console.log('User list:', userList); 
}); 

您也可以在大量的簡化store.getUserList.then(result => { return result })不會執行任何操作,因此您可以將其刪除,實際上您的地圖正在傳遞身份識別功能,因此它也不會執行任何操作。這全功能定義等同於store.getUserList =() => store.findUsers();,這似乎是一個很沒用的功能時,你可以只調用store.findUsers();,而不是直接和使用它像這樣:

store.findUsers().then(userList => { 
    console.log('User list:', userList); 
}); 
0

所以,這裏的關鍵是不返回任何東西。你不知道什麼時候該承諾會回來,所以返回並不意味着太多,因爲代碼不會等待你的承諾。

取而代之的回覆,呼叫承諾的回調中的另一個函數做什麼是你想做的事:

doSomething.then((myData) => { 
    somethingToDoWithData(myData); 
}); 
+0

爲什麼向下票呢? –