Я пытаюсь сделать некоторые бенчмаркинг на различном стиле яваскрипта кода, вот что у меня есть:изменение обещание глобальной переменной в цикле для
var Promise = require('bluebird');
var timer = function(name) {
var start = new Date();
return {
stop: function() {
var end = new Date();
var time = end.getTime() - start.getTime();
console.log('Function:', name, 'finished in', time, 'ms');
}
};
};
function regular (a, cb) {
if (a % 2 === 0) return cb(null, a);
return cb(a);
}
function promise (a) {
return new Promise (function (resolve, reject) {
if (a % 2 === 0) resolve(a);
else reject(a);
});
}
var t = timer('regular');
var g = 0;
for (var i = 1; i < 10001; i++) {
regular(i, function(odd, even) {
if (odd) g = g + (odd * 2);
else g = g + (even * 3);
});
}
console.log('g:', g); // g: 125015000
t.stop();
var t2 = timer('promise');
var h = 0;
for (var i = 1; i < 10001; i++) {
promise(i).then(function(x) {h = h + (x*3);}).catch(function(x) {h = h + (x*2);});
}
console.log('h:', h); // h: 0
t2.stop();
Что интересно есть обещания не изменяет глобальную переменную 'h', как я могу заставить его возвращать тот же результат, что и переменная 'g'?
UPDATE
Здесь изменен код, который попытается получить конечный результат, но недетерминированы обещания дают нам неожиданный результат.
for (var i = 1; i < 10001; i++) {
promise(i).then(function(x) {
h = h + (x*3); if (x===10000) console.log('h:', h);
}).catch(function(x) {h = h + (x*2);}); // h: 75015000
}
В настоящее время мой код, который дает ожидаемый результат, еще более странный.
for (var i = 1; i < 10001; i++) {
promise(i).then(function(x) {
h = h + (x*3);
}).catch(function(x) {
h = h + (x*2);
if (x===9999) console.log('h:', h); // <- attention here
}); // h: 125015000
}
Может ли кто-нибудь показать мне лучший код и объяснить код выше? (Код выше показывает детерминированный правильный результат, когда i составляет 9999, а не 10000)
Вы используете несколько, не-секвенировали обещаний означает, что они могли бы работать в непредсказуемом порядке. И вы используете их для синхронных операций. Ничто из этого не имеет смысла и, конечно же, не описывает практическое использование обещаний в реальном мире. Я предпочел бы увидеть реальную проблему, которую вы пытаетесь решить, или посоветовать вам вообще не использовать обещания. – jfriend00
Я согласен с @ jfriend00. Но так как вы спрашиваете: ваша переменная 'h' ** обновляется **, но' console.log ('h:', h); 'выполняется (асинхронно), прежде чем все эти обещания будут выполнены. Вы можете увидеть это с помощью 'setTimeout (function() {console.log ('h:', h);}, 2000);' – Viktor
@Viktor Можете ли вы показать нам пример, чтобы получить результат ** сразу после ** вычисление? – nobody