我不了解承诺。我知道承诺是可以成功或错误完成的对象。而且,通过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
。
答案 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);
});