JavaScript(NodeJS)承诺待定?

function f () { return new Promise(function (resolve, reject) { resolve(4); }) } function g () { return f().then((res) => {return res;}) } console.log(g()); 

这返回 Promise { <pending> }

如果我返回res (在那里),然后返回f() ,为什么不是输出4

一个有效的答案是:

 function f() { return new Promise(function(resolve, reject) { resolve(4); }) } function g() { return f().then((res) => { return res; }) .then((res) =>{ console.log(res); }) } g() 

为什么? 任何时候你从一个承诺中的陈述中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())仍然会返回一个promise。 这是因为在实际的函数g ,parsingpromise会被延迟,因此不会阻止我们的代码执行,但函数体可以利用f的返回值。

注:要运行这个,你需要节点7,它应该用--harmony-async-await选项来执行。

===========
编辑包括新的代码片段
看下面的代码。 您必须使用以访问以前的对象 – 但是,在这种情况下访问它的地方取决于您。 你可以在Promise.all每个promise上调用,然后.then((userVictories) => ...).then(...)或者一次Promise.all返回。 重要的是要注意,Promise.all只返回所有包含解决scheme的承诺。

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

我们先来看看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现在的价值是多less? 提示:这不是string'Hello'

约定了!

这是什么回报?

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

它返回一个承诺! 承诺允许我们访问稍后调用的函数中的值。 在函数执行之前,您将无法访问“返回”或“解决”的承诺。 一旦你input了一个promise链,你总是必须使用.then(fn)来处理程序stream中的下一步。

Javascript是asynchronous的 。 所有顶级代码按顺序执行而不中断。 在您的console.log完成执行后很久,这个承诺就会解决。 为了重新获得价值,你需要留在承诺链上:

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