解决承诺数据

时间:2018-10-03 06:32:58

标签: javascript es6-promise

考虑下面的代码段

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);
    });

有人可以解释为什么它会这样。

4 个答案:

答案 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";
 });
}