Javascript 强制承诺解决命令

Javascript 强制承诺解决命令,javascript,google-chrome-extension,macros,promise,async-await,Javascript,Google Chrome Extension,Macros,Promise,Async Await,我有一个解析器函数macroBuilder()遍历文本和解析宏。 有些宏解析为文本,还有一些嵌套宏需要另一个过程。函数返回一个字符串 我将嵌套处理为: let fragments = []; fragments.promises = []; fragments.push = function() { let fragments = this; for (let i = 0; i < arguments.length; i++) { if (typeof arguments[

我有一个解析器函数
macroBuilder()
遍历文本和解析宏。 有些宏解析为文本,还有一些嵌套宏需要另一个过程。函数返回一个字符串

我将嵌套处理为:

let fragments = [];
fragments.promises = [];
fragments.push = function() {
  let fragments = this;
  for (let i = 0; i < arguments.length; i++) {
    if (typeof arguments[i].then === 'function') {
      let id =  Date.now() + i + this.length;
      let promise = arguments[i]
        .then( function(id, val) {
          fragments[fragments.indexOf(id)] = val;
        }
        .bind(undefined, id))
        .catch( function(id, err) {
          fragments[fragments.indexOf(id)] = '';
        }
        .bind(undefined, id) );
      this.promises.push(promise);
      arguments[i] = id;
    }
  }
  return Array.prototype.push.apply(this, arguments);
}
然后,当我在循环中浏览标记化文本时,我会:

textMacro(obj) {
  fragments.push(obj['text'])
},
anotherMacro(obj) {
  ...
},
nestedMacro(obj) {
  fragments.push(
    resolveMacro(obj['name'])
      .then(res => {
          return macroBuilder(res);
      }
  );
}
这很好,可以预期,解码为文本的宏会立即被推入
片段
数组,而嵌套宏会在所有常规宏都已解析为文本后在下一个过程中解码

我需要按宏出现的顺序处理宏,因为处理某些宏会产生副作用,需要考虑这些副作用,然后处理顺序中的下一个宏

尝试通过将常规文本结果转换为承诺来处理此问题,因此
textMacro()
函数如下所示:

textMacro(obj) {
  fragments.push(
    new Promise((resolve, reject) => {
      resolve(obj['text']);
    })
  );
}
这样,我希望一切都能按正确的顺序解决。但是,我的
textMacro()
和其他非嵌套类型的宏解析程序立即解决了这个问题


我做错了什么?

我正试图遵循这一点。你能发布macroBuilder的代码吗?你能告诉我们你是如何循环结果的吗?你的
.push
“覆盖”片段看起来过于复杂,而且不必要,这有什么意义<代码>除了。。。i、 它一点也不好用
textMacro(obj) {
  fragments.push(
    new Promise((resolve, reject) => {
      resolve(obj['text']);
    })
  );
}