在 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/

10-11 11:38