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 ?
答案 0 :(得分: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()
为什么呢?只要你在promise中的return
语句中then
,它就会将它传递给下一个语句(then or catch)。尝试发表评论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
中,解析promise会被延迟,因此不会阻止我们的其余代码执行,但函数体可以使用f
返回的值。 / p>
注意:要运行它,您需要节点7,它应该使用--harmony-async-await
选项执行。
===========
编辑以包含新的代码段
请查看以下代码。您必须使用then来访问以前的对象 - 但是,在这种情况下您访问它的位置取决于您。然后,您可以调用Promise.all
内的每个承诺,在这种情况下.then((userVictories) => ...).then(...)
或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
*/
})
答案 1 :(得分:0)
让我们首先看一下 jQuery 作为学习承诺的介绍。
此代码返回什么? i = 0
的价值是什么?
result
提示:它不是var result = $('body');
正文HTML元素。
<body/>
是 jQuery集合对象。在内部,它包含对body标签的引用。但实际的result
对象是一个集合。
这又是什么回报?
result
再次,它返回一个jQuery集合。
这个?
var result = $('body').css('background', 'red');
同样的事情。一个jQuery集合。
现在,这个基于承诺的代码会返回什么?
var result = $('body').css('background', 'red').animate({height: "20px"});
很明显这会带来一个承诺。但是这段代码呢?
var result = new Promise();
现在var result = new Promise().resolve().then(() => {
return 'Hello';
});
的价值是多少?提示:这不是字符串result
。
这是一个承诺!
这又是什么回报?
'Hello'
它回报了一个承诺! Promise让我们访问稍后调用的函数中的值。在执行该函数之前,您将无法访问承诺“返回”或“解析”的任何内容。输入承诺链后,您始终必须使用var result = new Promise().resolve().then(() => {
return new Promise().resolve();
}).then(() => {
return 'Hello';
}).catch(() => {
console.log('Something went wrong');
});
来处理程序流程中的下一步。
Javascript 异步。所有顶级代码都按顺序执行而不会暂停。承诺将在您.then(fn)
执行完毕很久之后解决。为了获得价值,你需要留在承诺链土地上:
console.log