Я пытаюсь указать sort_order или оставить его пустым. Когда он указан, он используется. Если он не указан, в базу данных запрашивается наибольшее число, которое увеличивается и используется. Моя проблема в том, что вызов базы данных является асинхронным и находится внутри оператора if.
Как лучше всего гарантировать, что "sort_order" не является неопределенным перед вставкой новых данных в базу данных?
Фрагмент кода показан ниже:
if (sort_order == undefined) {
MongoClient.connect(dbUrl, function (err, db) {
var dbo = db.db("HIDDEN");
dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 } }, function (err, data) {
sort_order = data.sort_order + 1;
});
});
}
console.info(sort_order);
Заранее спасибо,
Джеймс
РЕДАКТИРОВАТЬ (06.08.2018): я считаю, что этот вопрос отличается от другого предложенного, потому что есть случай, когда sort_order не undefined и может быть указан ранее. Используя ответы на другой вопрос, можно было бы написать дубликат (внутри обратного вызова внутри оператора if и после оператора if)





Вам следует перейти от обратных вызовов к Promises или Async / Await, последнее намного легче читать:
async function retrieveValue(sort_order) {
if (sort_order === undefined) {
const db = await MongoClient.connect(dbUrl);
const dbo = db.db("HIDDEN");
const data = await dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 }});
return data.sort_order + 1;
};
return sort_order;
}
РЕДАКТИРОВАТЬ (с блоком try-catch):
async function retrieveValue(sort_order) {
try {
if (sort_order === undefined) {
const db = await MongoClient.connect(dbUrl);
const dbo = db.db("HIDDEN");
const data = await dbo.collection("HIDDEN").findOne({}, {"sort": { sort_order: -1 }});
return data.sort_order + 1;
}
} catch (error) {
console.info(error);
}
return sort_order;
}
Вы в основном помечаете функцию как async, когда определяете ее, и всякий раз, когда вы ожидаете Promise, вы отмечаете ее как await, чтобы она «ожидала» ваших данных.
@JamesB. взгляните на отредактированный ответ, вы можете заключить его в блок try-catch, чтобы получить ошибку в операторе catch.
Именно то, что мне было нужно! Мне всегда казалось, что концепция async / await сбивает с толку, но это прекрасно ее проясняет. Однако, если в строке «const data = ...» была возвращена ошибка, как бы вы ее получили? При использовании обратных вызовов есть два параметра для ошибки и данных.