javascript-链接命令是否总是按顺序执行?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-链接命令是否总是按顺序执行?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1634字,纯文字阅读大概需要3分钟。
内容图文
在node.js(异步)中进行编码时,我可以依靠链式命令来按顺序执行吗?
var x=new MyObject();
x.start().doAThing().stop()
会先开始运行,然后再运行doAThing,然后停止吗?
解决方法:
tl; dr从技术上讲,是的,但是如果链中的某些函数是异步的,则您可能需要考虑以不同的方式组织代码.
例如,序列x.start().doAThing().stop()中的每个方法都是一个方法调用,它需要一些对象来进行操作.为了调用doAThing(),JavaScript VM必须首先评估x.start(),然后查找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或生成器来重写代码.例如,承诺:
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-链接命令是否总是按顺序执行?全部内容,希望文章能够帮你解决javascript-链接命令是否总是按顺序执行?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。