Оператор возврата в обещании then

#javascript #promise

#javascript #обещание

Вопрос:

Я изучаю Promises (обещания ванильного es6 из этой прокладки), и у меня есть 2 функции, каждая из которых возвращает новое обещание и вызывается 3-я функция magic() , которая вызывает 2 функции, а также возвращает обещание.

Пример кода:

 var CreatorX = {
    "create": function() {
        var p = new Promise(function(resolve, reject) {
            window.setTimeout(function() {
                window.console.log("created");
                resolve(22);
            }, 100);
        });
        return p;
    }
};

var CreatorY = {
    "create": function(id) {
        window.console.log("id "   id);
        var p = new Promise(function(resolve, reject) {
            window.setTimeout(function() {
                resolve(2244);
            }, 5);
        });
        return p;
    }
};
  

И вот волшебство:

 function magic() {
       return CreatorX.create().then(function(d) {
            CreatorY.create(d); // shouldn't it be 'return CreatorY...'?
        });
}

var r = magic();
r.then(function() {
    console.log("Done");
}, function(err){console.error("oops")});
  

Мой вопрос в том, почему это работает? У меня нет оператора return в строке with CreatorY.create(d) в функции magic, и все же, похоже, это работает. Должен return ли он быть там? Это просто совпадение, что это работает?

Ответ №1:

Когда вы возвращаете что-то из функции Promise, обещание разрешается с помощью возвращаемого вами значения. Возвращаемое значение из обещанной функции будет передано связанной функции promise.

В вашем случае вы ничего не возвращаете явно. Таким образом, JavaScript разрешит обещание с undefined помощью и это будет доступно для

 function() {
    console.log("Done");
}
  

функция. Но вы игнорируете разрешенное значение из предыдущего обещания. Если вы действительно хотите его использовать, измените функцию на

 function(result) {
    console.log(result);
}
  

Теперь вы сможете увидеть фактическое разрешенное значение.

Комментарии:

1. Спасибо, я не понял, что консоль. войдите в методы CreateY.create() не является частью обещания как такового, оно вызывается синхронно, как только я перенесу ведение журнала в функции тайм-аута, мне это ясно.

Ответ №2:

Ваша функция magic() возвращает обещание, поэтому CreatorY.create(d) выполняется вызов, но когда вы говорите r.then(... , что выполняется обещание от вызова до return CreatorX.create().then(...