Javascript(NodeJS)承诺待定?

时间:2016-12-31 19:24:51

标签: javascript node.js

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

2 个答案:

答案 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