tl; dr Технически, да, но вы можете рассмотреть возможность организации кода по-другому, если некоторые функции в цепочке асинхронны.
Например, каждый метод в последовательности x.start().doAThing().stop()
является вызовом метода, и это требует какого-либо объекта, чтобы работать на. Для того, чтобы позвонить в doAThing()
, виртуальная машина JavaScript должна сначала оценить x.start()
, затем найти функцию doAThing
и только тогда она может начать выполнение doAThing
.
Что будет doAThing
может быть совершенно иным в зависимости от значения x.start()
!
MyObject.prototype.start = function() {
if (/* condition */) {
return {
doAThing: function() {
return {
stop: function() {
console.log('path1');
}
};
}
};
}
else {
return {
doAThing: function() {
return {
stop: function() {
console.log('path2');
}
};
}
};
}
};
Однако ваша функция может запускать асинхронную задачу, которая может случиться не по порядку.
MyObject.prototype.start = function() {
setTimeout(function() {
// This will happen out-of-order, usually after `stop` returns!
console.log('timed out');
}, 0);
return {
doAThing: function() {
return {
stop: function() {
console.log('stop');
}
};
}
};
};
См. На jsbin. Выход:
stop
timed out
Если у вас есть функции асинхронных цепи, вы должны переписать код с использованием обратных вызовов, обещаний или генераторов. Например, с обещаниями:
var start = function (obj) {
return new Promise(function (resolve) {
setTimeout(function() {
// This will happen in order.
console.log('timed out');
resolve(obj);
}, 0);
});
};
var doAThing = function (obj) {
return Promise.resolve(obj);
};
var stop = function (obj) {
// Synchronous functions are fine, too.
console.log('stop');
};
Эта цепь будет выполнять эти функции в следующем порядке:
Promise.resolve(x)
.then(start)
.then(doAThing)
.then(stop);
Выход:
timed out
stop
Да, они всегда будут выполняться по порядку. – idbehold
Краткий ответ: ** Да ** –
Сами функции будут выполняться в ожидаемом порядке, однако действия, указанные в функции, могут не выполняться в ожидаемом порядке. –