#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(...