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> }
Javascript(NodeJS)承诺待定?
如果我回到res
(在当时),然后返回f()
,为什么不是输出?
一个有效的答案是:
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
*/
})
但是在这里:var membersArray = groupFound.members; Promise.all(membersArray.map((构件)=> { 返回分贝 .doneTodo .find({ 'victor._id':member._id}) 。然后((userVictories)=> { 返回{ 电子邮件:member.email, 胜利:userVictories.length } }); }))'我们不需要在对象前加上“then”? – user7361276
'我们不需要在对象前面附加“then”?,哪个对象? 'db.doneTodo.find'返回一个承诺,然后调用'.then((userVictories)=> ...'。我不完全理解您的评论 – andy9775
最后一个带有“email”和“胜利”的对象... “ – user7361276
让我们来看看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));
谢谢!尽管如此:'Promise.all(membersArray.map((member)=> { return db ///需要返回这里 .doneTodo .find({'victor._id':member._id}) 。然后((userVictories)=> { 返回{ 电子邮件:member.email, 胜利:userVictories.length } }); })),然后((RES)=>控制台。日志(res))'? – user7361276
在{{return {email:member.email,胜利:userVictories.length}'后没有任何东西' – user7361276
Promise.all后的链接.then()将是一个数组,其中包含每个已解析的承诺的值https:/ /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all –
如果是返回4,你会链接'then's? –
@WiktorZychla?在'return f()。then((res)=> {return res;})'中,是否给出了'4'?由于'then'返回4? – user7361276
然后不返回4,它返回一个Promise。您作为参数传递的函数然后返回4. –