我想知道是否可以将回调值赋给变量。我最近遇到了MongoClient的connect方法的问题,我想获取db对象并将其传递给我的类方法。我有办法将hello world
分配给var b
。
function testCB(cb){
setTimeout(() => {
cb('Hello World')
}, 1000)
}
let b = testCB('a', (str) => {
return str;
})
console.log(b) //undefined
答案 0 :(得分:0)
由于事件是异步的,您需要遵循异步代码流。因此,获得回报的唯一途径是"在你的回调函数里面,即:
function testCB(cb){
setTimeout(() => {
cb('Hello World')
}, 1000)
}
let b = testCB('a', (str) => {
// this executes async, when testCB finishes running
console.log(str) // will print STR
return str;
})
// this code executes BEFORE testCB finish running,
// so it is imposible to get the value of str here.
如果您想要更流畅的代码,可以尝试使用节点7 +上可用的async
和await
的承诺
答案 1 :(得分:0)
目前,您要为b
分配调用testCB
的结果,但testCB
不会返回任何内容,因此不会向b
分配任何内容。
但这种模式没有错:
var b;
testCB( (str) => { b = str; } );
这是在变量(b
)中维护应用程序状态的最简单版本,并使用异步函数修改该状态。
如果您的应用程序的许多部分依赖于b
,并且您希望同步定义该依赖关系:那就是Promises的用途!
在这种情况下,您可以定义:
var b = new Promise((resolve, reject) => {
setTimeout(() => resolve('Hello World'), 1000);
});
b.then((str) => {...do something with str...}
b.then((str) => {...do something else with str...}
doSomeThingWithB(b);
doSomeThingWithB
当然知道b
是承诺(或“可以”)。