承诺JS中的决心和回报之间的区别

时间:2017-01-03 00:53:45

标签: javascript node.js

var p1 = new Promise (function (res, rej){
    res(42);
}).then((result) => {return result;});

**如果我有** return result

这个承诺是否得到了解决? “已解决的承诺”是什么意思?

3 个答案:

答案 0 :(得分:5)

Java Script是一种单线程语言。这简化了大多数任务;但是,这意味着必须在回调函数中处理异步任务。 Promise是面向对象类型的回调,它提供比简单回调函数更强大的功能。

已解决保证意味着将调用promise对象的then函数。在您的示例中,承诺已得到解决。

被拒绝的承诺意味着将调用promise对象的catch函数。

then函数中返回结果,允许chaining。然后,每个结果都可以在将结果传递给链中的下一个承诺之前更改或操纵结果。

在您的示例中,您解决了第一个承诺,然后为链中的下一个承诺返回了一个结果,您将无法有效处理返回的结果。

答案 1 :(得分:4)

在询问承诺之前,你应该考虑一下这个功能

result => result

这是编写

的较短方式
(result) => { return result; }
实际上确实如此。它被称为identity函数,这意味着它会准确返回传入的内容。

作为then处理程序,那么,它意味着什么都没有 - 它是no-op。因此then返回的承诺处于完全相同的状态,具有完全相同的值(如果有的话),作为您调用then的承诺。

仔细考虑promise.then(fn)的作用。它创造了一个新的承诺。只要promise仍处于待定状态,那么新的承诺也将保持未决状态。如果满足promise,则调用fn并将已实现的值作为参数,执行fn,并且(所有其他条件相同)使用来自{的返回值来履行新的承诺{1}}。另一方面,如果和fn被拒绝,则不会调用promise,并且假设没有第二个参数传递给fn,则新承诺将被置于拒绝状态具有相同的拒绝原因 - 实质上,在这种情况下,承诺可以被认为是“通过”。

所以在

的情况下
then

其中promise.then(identity) identity,当result => result符合某个值promise时,v的参数为identity,返回相同的值v,并履行由v创建的具有相同值的新承诺 - 换句话说,它创建一个新的承诺,其状态和值与{{1}完全相同}。换句话说,它什么都不做 - 或者更确切地说,只是创建一个与then被调用的新承诺相同的新承诺。

在你的情况下:

promise
  

这个承诺是否得到了解决? “已解决的承诺”是什么意思?

通过调用then,通过调用promise构造函数(var p1 = new Promise (function (res, rej){ res(42); }) .then((result) => {return result;}); )创建的promise立即通过值new Promise来实现。 (你也可以写42,这意味着完全相同的事情。)res(42)创造了第二个承诺。由于已经履行了Promise.resolve(42)被调用的第一个承诺,因此then处理程序将立即使用then的参数(then)调用。它返回相同的值,因此第二个承诺(由result创建的承诺)将使用该值42来实现。因此,此时then是履行承诺,其值为42

p1

您将看到42登录到控制台。

上述任何一项都没有什么特别神奇之处。这一切都源于承诺的基本原则:它们可能的状态,如果需要,如何创建它们,以及42的含义。好的教程或文档(如this one)可以帮助您走上正确的道路。

答案 2 :(得分:0)

使用值result解决承诺。在您编写的代码段中,then块不会更改任何内容,因为它会使result值解析,就像没有return语句而没有{{1}一样阻止。

但是,如果您返回不同的值,则承诺将使用该值解析。如果你要在这个then中返回另一个promise,你就可以“链接”这些块,也就是你可以编写一个下一个'then'块,它将接收前一个{{1阻止。

已解决的承诺意味着,承诺处理的代码已完成,并且传递给then方法的回调中的代码将在传入已解析的值的情况下执行。