2017-09-26 27 views
0

我正在使用eval在nodejs应用程序中执行一个字符串作为javascript代码。问题是如果字符串包含多个promise,我不知道eval执行是否完成。如何知道`eval`执行是否完成,如果里面有多个promise

const userFind = 'function usersFind(db, userAge, userNameLast) {\ 
    const useDb = db.db("test");\ 
    const query = {\ 
    "user.age": { $gt: userAge },\ 
    "user.name.last": userNameLast\ 
    };\ 
    const returnData = new Promise(resolve => {\ 
    const arrayData = useDb.collection("users").find(query).limit(1).toArray();\ 
    resolve(arrayData);\ 
    });\ 
    return returnData;\ 
}\ 
let results = usersFind(db, 5, "Lee", 1);\ 
results.then(r => {\ 
    r.forEach(doc => {\ 
    console.log(JSON.stringify(doc));\ 
    });\ 
});\ 
results = usersFind(db, 5, "Lee", 1);\ 
results.then(r => {\ 
    r.forEach(doc => {\ 
    console.log(JSON.stringify(doc));\ 
    });\ 
});\ 
'; 

上面的脚本定义了一个字符串包含两个promise。如果我运行下面的代码:

无需等待承诺

eval(userFind)

eval函数返回。 我怎么知道两个承诺何时完成?

+4

问题是,为什么使用代码字符串,然后使用'eval'来处理呢? – Rajesh

+1

第一个解决方案:不使用eval? –

回答

2

链条.then()eval()致电。您也可以使用Function构造

let fn = `() => 
 
      new Promise(resolve => 
 
      setTimeout(resolve, Math.floor(Math.random() * 1200), "resolved"))`; 
 
      
 
let promiseString = new Function(`return ${fn}`)(); 
 

 
promiseString() 
 
.then(res => console.log(res)) 
 
.catch(err => console.error(err));

+0

我认为它只有在'eval'中的最后一条语句是承诺才有效,对吧? –

+0

你引用了哪些特定的代码?请注意,函数不会返回值,它会传递给位于'usersFind()'调用'.then()'的调用 – guest271314

+0

您的意思是我需要在代码的末尾添加'return results'? –

相关问题