考虑下面的代码段
function one(){
var prm = new Promise(function(resolve,reject){
resolve("one");
});
prm.customKey = function(){
}
return prm;
}
function two(){
var prm = one();
prm.then(function(res){
return "two";
});
return prm;
}
function three(){
return one().then(function(res){
return "two";
});
}
我希望以下两个控制台将res控制台表示为“ two”(解决“ two”)。
但是奇怪的是 i)控制台res为“ one”, ii)控制台的分辨率为“两个”
i) two().then(function(res){
console.log(res);
});
ii) three().then(function(res){
console.log(res);
});
有人可以解释为什么它会这样。
答案 0 :(得分:2)
因为您返回了prm。 那是一个承诺,会回报一个。 返回语句为“ two”的地方,此return语句用于它所调用的函数,这意味着.then语句中的回调。
它不会影响本身。您只是在two()方法中使用了一个promise(来自one()),并按原样返回了它。
答案 1 :(得分:0)
在第二和第三个函数中,您还应该返回新的Promise
,它等待另一个Promises并解决其响应,如下所示:
function two(){
return new Promise((resolve,reject) => {
one().then(() => resolve("two"));
});
}
答案 2 :(得分:0)
在函数 two 中,函数返回的prm变量实际上并没有更新。
直接在此行之后
var prm = one();
它跳到这一行
return prm;
因为它不期望现在从诺言中获取数据。
但是,在另一个功能 3 中,您返回了诺言,因此结果如您所愿弹出。
要使 2 获得与 3 相同的结果,请添加异步并等待
async function two(){
var prm = one();
await prm.then(function(res){
prm = "two";
});
return prm;
}
答案 3 :(得分:-1)
尝试对此进行修改:
function two(){
var prm = one();
prm.then(function(res){
return "two";
});
}