簡體   English   中英

貓鼬異步請求管理

[英]Mongoose async requests managment

我實際上正在嘗試使用javascript中的貓鼬將mongodb引用轉換為那些引用的文檔值(info.value)。

通過使用map,for / forEach進行了嘗試,由於貓鼬請求是異步的,因此該工作沒有任何作用。

我不太習慣這種代碼,在嘗試了所有這些東西之后,我感到有些迷失。

也許有人想通過看下面的代碼給我一些提示。

僅提供信息,無需擔心加載模板,連接到mongo的問題,因為其他一切都很好。

這是我最接近預期結果的方法,但是當我嘗試“ console.log(cond [c]); / console.log(info); ”(cond [c]和info為null時,它仍然拋出錯誤和未定義)

因為我計划將子塊放在塊對象的“內容”屬性中,所以還需要准備該函數以遞歸。

非常感謝您的寶貴時間。

// Input condition
"H1Vf3KTef || false"

// Expected result
"1 || false"

// Buggy Function
var execIfBlock = function recursExec (query, callback) {
  IfBlockModel.findOne(query, function(err, ifBlock) {
    if (!err) {
      var cond = ifBlock.condition.split(" ");
      //console.log('Block : ' + ifBlock);
      //console.log('Condition : ' + cond);
      var calls = new Array();
      for (var c = 0, len = cond.length; c < len; c++) {
        if (shortId.isValid(cond[c])) {
          calls.push(function() {
            InfoModel.findOne({ _id: cond[c] }, function(err, info) {
              console.log(cond[c]);
              console.log(info);
              cond[c] = info.value;
            });
          });
        }
      }
      async.parallel(calls, function(err, result) {
        console.log(result);
        // Do some job using the final expected result : "1 || false"
      });
    }
  });
};

// Info template
{
  "_id": "H1Vf3KTef",
  "value": "1"
}

// Bloc template
{
  "_id": "rkRBtLTef",
  "content": [],
  "condition": "H1Vf3KTef || false"
}

// Info schema
var InfoSchema = new Schema({
  _id: { type: String, unique: true, required: true, default: shortId.generate },
  value: { type: String, default: "0" }
});

// Bloc schema
var IfBlockSchema = new Schema({
  _id: { type: String, unique: true, required: true, default: shortId.generate },
  condition: { type: String, required: true, default: true },
  content: [{ type: String, required: true, default: '', ref: 'block' }]
});

使用Promise並在一些小函數中破壞代碼:

var execIfBlock = function recursExec(query, callback) {
    IfBlockModel.findOne(query, function (err, ifBlock) {
        if (!err) {
            var cond = ifBlock.condition.split(" ");

            updateMultipeInfo(cond)
                .then(values => {
                    console.log(values) // [values1, values ,...]
                });
        }
    });
};


function updateMultipeInfo(cond){
    return Promise.all(cond.map(updateInfo))
}

function updateInfo(id){
    if (shortId.isValid(id)) {
        return InfoModel
            .findOne({ _id: id })
            .then(info => info.value);
    } else {
        return Promise.reject("invalid id");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM