Разрешение данных обещаний - PullRequest
0 голосов
/ 03 октября 2018

Учитывая приведенный ниже фрагмент кода,

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 как «два» (решите «два»).

Но, как ни странно, i) консоли - как «один», ii) консоли - как «два»

i) two().then(function(res){
       console.log(res);
   });

ii) three().then(function(res){
       console.log(res);
    });

Может кто-нибудь объяснить, почему они так себя ведут.

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

В функции two переменная prm фактически не обновлялась, когда она возвращалась функцией.

после этой строки непосредственно var prm = one();

она переходит наэта строка return prm;

, поскольку она не ожидает получения данных прямо из обещания.

Однако в другой функции three вы возвращаете обещание,поэтому результат появится так, как вы ожидаете.

Чтобы two получил те же результаты, что и three , добавьте async и ждите

async function two(){
    var prm = one();
    await prm.then(function(res){
        prm = "two";
    });
    return prm;
}
0 голосов
/ 03 октября 2018

Попробуйте изменить функцию на это:

function two(){
  var prm = one();
  prm.then(function(res){
    return "two";
 });
}
0 голосов
/ 03 октября 2018

Во второй и третьей функции вы также должны вернуть новый Promise, который ждет другого обещания и разрешает его ответ, примерно так:

function two(){
   return new Promise((resolve,reject) => {
      one().then(() => resolve("two"));
   });
}
0 голосов
/ 03 октября 2018

Потому что вы вернетесь prm.Это обещание, которое возвращает одно.В месте, где вы возвращаете «два», этот оператор возврата предназначен для вызываемой функции, то есть для обратного вызова внутри оператора .then.

Это не влияет на само обещание.Вы просто использовали обещание (from one ()) внутри вашего метода two () и вернули его как .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...