一個有效的答案是:
function f() {
return new Promise(function(resolve, reject) {
resolve(4);
})
}
function g() {
return f().then((res) => {
return res;
})
.then((res) =>{
console.log(res);
})
}
g()
爲什麼?任何時候你從一個承諾中的then
聲明中return
,它將它傳遞給下一個聲明(然後或捕獲)。嘗試註釋掉return res
,你會看到它打印undefined
。
==============
但是,使用ES7我們可以使用async/await
。我們可以使用下面的代碼複製以上:
function f() {
return new Promise(function(resolve, reject) {
resolve(4);
});
}
async function g() {
var a = await f();
// do something with a ...
console.log(a);
}
g();
需要注意的是console.log(g())
仍然會返回一個承諾是很重要的。這是因爲在實際功能g
中,解析承諾會被延遲,因此不會阻止其他代碼執行,但函數體可以使用從f
返回的值。
注意:要運行此操作,您需要節點7並且它應該使用--harmony-async-await
選項執行。
===========
編輯,包括新的代碼片斷
請看下面的代碼。您必須使用它才能訪問以前的對象 - 但是,在這種情況下訪問它的位置取決於您。您可以在Promise.all
內部的每個承諾上致電,在這種情況下,或Promise.all
一次返回。請務必注意,Promise.all一次返回全部承諾包含解決方案。
var membersArray = groupFound.members;
Promise.all(membersArray.map((member) => {
return db.doneTodo.find({ 'victor._id': member._id }).then((userVictories) => {
return {
email: member.email,
victories: userVictories.length,
}
}).then(obj => {
/*
obj is each object with the signature:
{email: '', victories: ''}
calling this then is optional if you want to process each object
returned from '.then((userVictories) =>)'
NOTE: this statement is processed then *this* promise resolves
We can send an email to each user with an update
*/
});
}))
.then((arr) => {
/*
arr is an array of all previous promises in this case:
[{email: '', victories: ''}, {email: '', victories: ''}, ...]
NOTE: this statement is processed when all of the promises above resolve.
We can use the array to get the sum of all victories or the
user with the most victories
*/
})
如果是返回4,你會鏈接'then's? –
@WiktorZychla?在'return f()。then((res)=> {return res;})'中,是否給出了'4'?由於'then'返回4? – user7361276
然後不返回4,它返回一個Promise。您作爲參數傳遞的函數然後返回4. –