【发布时间】:2020-09-22 11:40:22
【问题描述】:
各位大师,早安,
我构建了我的代码以允许来自用户的动态输入字符串(sCmd),然后该字符串将被推送到函数中
let res = Function("moment", '"use strict";' + sCmd).call(this, moment);
这是一个用户输入示例,允许他们调用“等待”命令
let sCmd = `
// ---- cmd START
function simulateFirebaseGet() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved from simulateFirebaseGet()');
}, 2000);
});
}
async function callAsyncFunc() {
console.log('#2 - run callAsyncFunc()');
let res = await simulateFirebaseGet();
console.log('#3 - start wait 2 sec')
console.log('#4 -', res);
console.log('#5 - waited 2 sec')
}
console.log('#1 - START Function()');
callAsyncFunc()
console.log('#6 - STOP Function()');
// ---- cmd END
`;
但它并没有按照我的预期工作。控制台日志
#1 - START Function()
#2 - run callAsyncFunc()
#6 - STOP Function()
#3 - start wait 2 sec
#4 - resolved from simulateFirebaseGet()
#5 - waited 2 sec
我期待下面的东西
#1 - START Function()
#2 - run callAsyncFunc()
#3 - start wait 2 sec
#4 - resolved from simulateFirebaseGet()
#5 - waited 2 sec
#6 - STOP Function()
我还提供了StackBlitz link。如果我把“等待”放在
await callAsyncFunc()
我会收到错误Error: Unexpected identifier
更新: 在@CertainPerformance 回复后,我选择了第二种方法并按顺序运行。凉爽的!但很快我注意到一旦我将调用者更改为
console.log("START OUTSIDE Function()");
let res = Function("moment", '"use strict";' + sCmd).call(
this,
moment
);
console.log("STOP OUTSIDE Function()");
控制台日志输出为
START OUTSIDE Function()
#1 - START Function()
run helper
#2 - run callAsyncFunc()
STOP OUTSIDE Function()
#3 - start wait 2 sec
#4 - resolved from simulateFirebaseGet()
#5 - waited 2 sec
#6 - STOP Function()
我需要它来运行
START OUTSIDE Function()
#1 - START Function()
run helper
#2 - run callAsyncFunc()
#3 - start wait 2 sec
#4 - resolved from simulateFirebaseGet()
#5 - waited 2 sec
#6 - STOP Function()
STOP OUTSIDE Function()
在我的用例中,我必须循环“Function(...).call()”并且它们需要按顺序处理。前面循环中的结果将用于“Function(...).call()”中后面的项中的计算。
【问题讨论】: