2016-12-31 109 views
1
function f() { 
    return new Promise(function (resolve, reject) { 

     resolve(4); 
    }) 
} 

function g() { 
    return f().then((res) => {return res;}) 

} 

console.log(g()); 

這將返回Promise { <pending> }Javascript(NodeJS)承諾待定?

如果我回到res(在當時),然後返回f(),爲什麼不是輸出?

+0

如果是返回4,你會鏈接'then's? –

+0

@WiktorZychla?在'return f()。then((res)=> {return res;})'中,是否給出了'4'?由於'then'返回4? – user7361276

+0

然後不返回4,它返回一個Promise。您作爲參數傳遞的函數然後返回4. –

回答

1

一個有效的答案是:

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 
    */ 
    }) 
+0

但是在這裏:var membersArray = groupFound.members; Promise.all(membersArray.map((構件)=> { 返回分貝 .doneTodo .find({ 'victor._id':member._id}) 。然後((userVictories)=> { 返回{ 電子郵件:member.email, 勝利:userVictories.length } }); }))'我們不需要在對象前加上「then」? – user7361276

+0

'我們不需要在對象前面附加「then」?,哪個對象? 'db.doneTodo.find'返回一個承諾,然後調用'.then((userVictories)=> ...'。我不完全理解您的評論 – andy9775

+0

最後一個帶有「email」和「勝利」的對象... 「 – user7361276

0

讓我們來看看jQuery的第一作一介紹,以學習的承諾。

此代碼返回什麼? result的值是多少?

var result = $('body'); 

提示:這不會是<body/>身體HTML元素。

result是一個jQuery收集對象。它在內部持有對body標籤的引用。但實際的result對象是一個集合。

這是什麼回報?

var result = $('body').css('background', 'red'); 

同樣,它返回一個jQuery集合。

而這個?

var result = $('body').css('background', 'red').animate({height: "20px"}); 

同樣的事情。一個jQuery集合。

現在,這個承諾基於代碼返回?

var result = new Promise(); 

這很可能是明確的這返回一個承諾。但是這個代碼呢?

var result = new Promise().resolve().then(() => { 
    return 'Hello'; 
}); 

result現在的價值是多少?提示:這不是字符串'Hello'

這是一個承諾!

這是什麼回報?

var result = new Promise().resolve().then(() => { 
    return new Promise().resolve(); 
}).then(() => { 
    return 'Hello'; 
}).catch(() => { 
    console.log('Something went wrong'); 
}); 

它返回一個承諾!承諾允許我們訪問稍後調用的函數中的值。在函數執行之前,您將無法訪問「返回」或「解決」的承諾。一旦您輸入承諾鏈,您總是必須使用.then(fn)來處理程序流程中的下一步。

Javascript is asynchronous。所有頂級代碼都按順序執行而不會暫停。在您的console.log完成執行後很長一段時間,這個承諾會解決。爲了獲得價值,你需要留在承諾鏈的土地:

g().then(result => console.log(result)); 
+0

謝謝!儘管如此:'Promise.all(membersArray.map((member)=> { return db ///需要返回這裏 .doneTodo .find({'victor._id':member._id}) 。然後((userVictories)=> { 返回{ 電子郵件:member.email, 勝利:userVictories.length } }); })),然後((RES)=>控制檯。日誌(res))'? – user7361276

+0

在{{return {email:member.email,勝利:userVictories.length}'後沒有任何東西' – user7361276

+0

Promise.all後的鏈接.then()將是一個數組,其中包含每個已解析的承諾的值https:/ /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all –