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) );