分解回调地狱如何传递值

Breaking down Callback Hell how do I pass a value?

本文关键字:何传递 地狱 回调 分解      更新时间:2023-09-26

在快速路由中使用单皮,我正在执行以下操作:

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()。如何将"数据"传递给getBuyerHistory函数,以便我可以使用它?

假设你有类似的东西:

(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));
}());

或者,如果您没有在 getBuyerHistory 中使用 this,则可以将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) {
    ...
}