在 node.js(异步)中编码时,我可以依赖我的链式命令按顺序执行吗?
var x=new MyObject();
x.start().doAThing().stop()
会先运行
start
,然后是 doAThing
,然后是 stop
吗? 最佳答案
tl;dr 从技术上讲,是的,但如果链中的某些函数是异步的,您可能需要考虑以不同的方式组织代码。
例如,序列 x.start().doAThing().stop()
中的每个方法都是一个方法调用,它需要一些对象来操作。为了调用 doAThing()
,JavaScript VM 必须首先评估 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
如果必须链接异步函数,则必须使用回调、promise 或生成器重写代码。例如,使用 promise :
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
关于javascript - 链式命令总是按顺序执行吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33021771/