承诺执行时间

时间:2017-12-12 13:53:27

标签: javascript macros promise async-await

我有一个基于PEG的解析器,处理文本输入。除常规宏外,它还支持嵌套 - 宏内的宏。

我的代码挂钩处理器功能 - async macroBuilder()包装每个visit() - 用于处理Promise中特定类型宏的方法:

dateMath(obj) {
  const dateAttribs = { format: obj.format };
  switch (dateAttribs.format) {
    ...
    default:
      fragments.push(
        new Promise((resolve, reject) => {
          resolve(moment(now).format(dateAttribs.format));
        });
      );
      break;
  }
}

要处理嵌套宏,我会这样做:

nestedSnippet(obj) {
  fragments.push(
    processSingleShortcut(constants.SHORTCUT_PREFIX.concat(obj.name), true)
    .then(res => {
      let result = macroBuilder(res, { retainWhitespace: true, nestedLevel: nestedLevel+1 }, clipboard, window.now);
      return result;
    })
    .catch(() => {
      console.log(`couldn't find match for nested snippet: ${obj.name}`);
    })
  );
}

最后,我做Promise.all()并将所有部分连成一个字符串。

但是,看起来嵌套部分无法正常工作,就像我想要的那样。我的想法是推进fragments一个Promise,在解决时将会:

  1. 致电processSingleShortcut()
  2. 使用前一个调用的结果作为异步函数macroBuilder()
  3. 的参数
  4. 返回macroBuilder()
  5. 的结果

    我需要这个,因为除了返回字符串之外,宏处理可能有副作用,我需要以前所有宏中的那些来正确处理fragments数组中的下一个。

    因此,我需要在评估之后的宏之前已经处理嵌套。它似乎没有包围嵌套宏的承诺,我需要。

0 个答案:

没有答案