打破回调链 - 节点

时间:2017-07-04 02:46:23

标签: javascript node.js express ecmascript-6 asynccallback

我想知道是否可以将回调值赋给变量。我最近遇到了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

2 个答案:

答案 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 +上可用的asyncawait的承诺

答案 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是承诺(或“可以”)。