Promise.resolve-意外结果

时间:2018-10-18 23:05:15

标签: javascript typescript es6-promise

我不了解承诺。我知道承诺是可以成功或错误完成的对象。而且,通过then执行异步函数和连接其他异步函数是很有用的。承诺的结果作为参数传递给最后执行的承诺(如果承诺正确结束)的then方法内的回调函数。

此示例不起作用。我正在通过setTimeout模拟异步调用。我的函数返回一个整数。我期望prom2的结果为5。为什么不起作用?我在做什么错,为什么?

var getProductId = function(){
    setTimeout(function () {
        return 5;
    }, 1500);
};
var prom2 = Promise.resolve(getProductId);

prom2.then(function(result){
    console.log("5 = " + result);
});

我也尝试过:

var getProductId = function(){
    setTimeout(function () {
        return 5;
    }, 1500);
};
var prom2 = Promise.resolve(getProductId());

prom2.then(function(result){
    console.log("5 = " + result);
});

注意:我要使用Promise.resolve而不是new Promise

2 个答案:

答案 0 :(得分:3)

spark-shell --packages "org.apache.hadoop:hadoop-aws:2.7.3" spark-submit --packages "org.apache.hadoop:hadoop-aws:2.7.3" 所做的全部工作就是获取一个表达式并将其转换为一个spark-sbumit,该表达式立即解析为该表达式。如果表达式是Promise.resolve以外的任何类型的纯值(原始,数组,对象等) other ,则Promise返回的Promise仍将解析立即。您的Promise函数未返回任何内容,因此您的Promise.resolve生成了一个getProductId,它立即解析为prom2的值。

Promise对您的情况无济于事-您需要将回调转换为undefined,并且唯一的方法要做的就是使用{{1} }构造函数:

Promise.resolve

使用Promise的时间是,如果您已经(同步)拥有一个值并将其转换为可以调用new Promise的{​​{1}}。例如,通过在以下代码中将console.log('start'); const getProductId = () => new Promise(res => setTimeout(res, 1500, 5)); getProductId().then(res => console.log(res));用作累加器的初始值,可以使用Promise.resolve构造一个简单的Promise链:

.then

答案 1 :(得分:2)

  

Promise.resolve()

     

Promise.resolve(value) 方法返回使用给定值解析的Promise对象。如果值是一个承诺,则返回该承诺;如果该值是可转换的(即具有"then" method),则返回的承诺将“跟随”该可转换,并采用其最终状态;否则,返回的承诺将被履行。此函数将嵌套的类诺言对象(例如,一个诺言解析为某个事物的诺言)的嵌套层扁平化为单个层。

因此,基本上,函数Promise.resolve返回的是getProductId的结果undefined。如果要获得结果5,则需要使用new Promise构造函数。

此代码段显示了getProductId的结果(55),以演示Promise.resolve的用法。

var getProductId = function() {
  setTimeout(function() {
    return 5;
  }, 1500);
  
  return 55
};
var prom2 = Promise.resolve(getProductId());

prom2.then(function(result) {
  console.log("55 = " + result);
});