2016-12-31 136 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 –