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']);
})
);
}