打破回调地狱我如何传递一个值?

时间:2016-04-21 20:24:40

标签: javascript callback mongoskin

在Express路线中使用Monoskin我正在做以下事情:

router.get(/getbuyerinfo, function(req, res) {

    var data = "data";

    db.collection('buyerRec').find().toArray(function(err, result) {
        if (err) throw err;
        console.log(result);

        db.collection('buyerHistory').find().toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            console.log(data);
        });
    });
});   

实际上更深刻了。但是为了尽可能地以最直接和最快捷的方式清理深度回调,即使不是最现代化的方式,我创建了:

router.get(/getbuyerinfo, getBuyerRec);

function getBuyerRec(req, res) {
    var data = "data";

    db.collection('buyerRec').find().toArray(getBuyerHistory);
}

function getBuyerHistory(err, result) {
    if (err) throw err;
    console.log(result);

    db.collection('buyerHistory').find().toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        console.log(data);
    });
}

我的问题是“数据”已不在范围内。 'data'值来自Express router.get()。如何将'data'传递给getBuyerHistory函数以便我可以使用它?

1 个答案:

答案 0 :(得分:1)

假设你有以下几点:

(function () {
  var data = "data";

  db.collection('buyerRec').find().toArray(getBuyerHistory);
}());

function getBuyerHistory(err, result) {
    if (err) throw err;
    console.log(result);

    db.collection('buyerHistory').find().toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        console.log(data);
    });
});

您可以创建一个返回函数的函数,并将data作为参数传递:

function factory(data) {
  return function getBuyerHistory(err, result) {
    ...
  };
}

然后您可以调用它来创建传递给toArray的函数:

(function () {
  var data = "data";

  db.collection('buyerRec').find().toArray(factory(data));
}());

或者,如果您未在this中使用getBuyerHistory,则可以将data绑定为上下文并将绑定函数传递给toArray

(function () {
  var data = "data";

  db.collection('buyerRec').find().toArray(getBuyerHistory.bind(data));
}());

或者,正如@Bergi正确指出的那样,您可以向getBuyerHistory添加另一个参数,并在没有上下文的情况下使用bind

(function () {
  var data = "data";

  db.collection('buyerRec').find().toArray(getBuyerHistory.bind(null, data));
}());

function getBuyerHistory(data, err, result) {
    ...
}