Эксперты JavaScript/Promise,
Я надеюсь, что вы можете мне помочь, потому что я не понимаю, как я могу создать функцию, которая возвращает существующее обещание вместо нового обещания. Я провел много исследований, но все примеры возвращают новое обещание каждый раз, когда вызывается функция.
Предположим, у меня есть функция, которая требует некоторого времени для обработки и генерирует другой результат каждый раз, когда она вызывается. Когда я использую новый метод обещания, мне все равно нужно каждый раз ждать завершения, и я не получаю одно и то же значение, если вспоминаю функцию.
Я включил доказательство концепции, которую я создал, которая работает так, как хотелось бы (если я что-то не упустил из виду). Я думаю, что это «решение» уродливо, потому что мне нужно переместить переменные в более высокую область видимости, и мне все еще нужно создавать новое обещание каждый раз, когда вызывается функция.
Мое предположение на данный момент; чтобы сделать этот хороший код, функция должна возвращать существующее обещание вместо нового, но если другие решения предоставляют ту же функциональность и более приятный код, сообщите мне об этом. Родной ES6 предпочтительнее.
Спасибо!
-
'use strict';
var p;
var q;
var randomNumber = function() {
return new Promise(function(resolve) {
console.log(`p: ${p}`);
if (typeof p === 'undefined') {
setTimeout(function() {
p = Math.random();
resolve(p);
}, 1000);
} else {
resolve(p);
}
});
};
var randomNumberPlusOne = function() {
return new Promise(function(resolve) {
console.log(`q: ${q}`);
if (typeof q === 'undefined') {
randomNumber()
.then(function(p) {
q = p + 1;
resolve(q);
});
} else {
resolve(q);
}
});
};
var showResult = function(result) {
console.log();
console.log(`r: ${result}`);
};
randomNumber()
.then(showResult);
randomNumber()
.then(randomNumberPlusOne)
.then(showResult);
randomNumberPlusOne()
.then(showResult);
setTimeout(function() {
console.log();
console.log('setTimeout:');
console.log();
randomNumber()
.then(showResult);
randomNumber()
.then(randomNumberPlusOne)
.then(showResult);
randomNumberPlusOne()
.then(showResult);
}, 2000);
- (код ниже основан на отзывах Берги;
'use strict';
var randomNumber = (function() {
var p = null;
return function() {
console.log('p:');
console.log(p);
console.log();
if (!p) {
p = new Promise(function(resolve) {
setTimeout(function() {
resolve(Math.random());
}, 1000);
});
}
return p;
};
})();
var randomNumberPlusOne = (function() {
var q = null;
return function() {
console.log('q:');
console.log(q);
console.log();
if (!q) {
q = randomNumber()
.then(function(p) {
return p + 1;
});
}
return q;
};
})();
var showResult = function(result) {
console.log(`r: ${result}`);
console.log();
};
randomNumber()
.then(showResult);
randomNumber()
.then(randomNumberPlusOne)
.then(showResult);
randomNumberPlusOne()
.then(showResult);
setTimeout(function() {
console.log();
console.log('setTimeout:');
console.log();
randomNumber()
.then(showResult);
randomNumber()
.then(randomNumberPlusOne)
.then(showResult);
randomNumberPlusOne()
.then(showResult);
}, 2000);
randomNumber
иrandomNumberPlusOne
будут возвращать одно и то же число при каждом вызове, не случайное число??? - person Bergi   schedule 05.08.2015