Я полный новичок в node.js, поэтому, пожалуйста, извините меня, если мой вопрос глупый. На самом деле я пытаюсь сделать, я получаю список с помощью асинхронной функции от mongodb и пытаюсь распечатать его после того, как я получу Полный список.Хотя я получаю список правильно, но не знаю, почему он выводит результат как null. Даже я думал, что это может быть ошибка Promise, поэтому я попытался использовать модуль sync, но без изменений в результате. кто-нибудь, пожалуйста, помогите мне исправить эту ошибку.
Код:
MongoClient.connect(url,function(err,db){
if (err) throw err;
var arr=[]
getBlocker().then(()=>showList())
Sync(()=>{
getBlocker()
showList()
})
function getBlocker(){
return new Promise(resolve=>{
var blQ = {blocked_user:data.tag_search_mail}
db.collection("block_list").find(blQ,{"_id":0}).toArray((err,res)=>{
for(let i=0;i<res.length;i++){
arr.push(res[i]["blocker"])
console.info(res[i]["blocker"])//but here it's printing the result correctly that means I'm getting result
}
})
resolve()
})
}
function showList(){
console.info(arr)//Here it's printing []
}
})
Кроме того, if (err) throw err; внутри асинхронного обратного вызова НИКОГДА не является правильным кодом. Вам нужно написать реальную обработку ошибок, сообщая результаты ошибки вызывающей стороне через обещание или обратный вызов.
@ jfriend00, сэр, не могли бы вы подвести меня к правильному ответу?
В ответе ВСЕ объясняется, что вас пометили как обман. Это часто задаваемый вопрос, и этот другой ответ полностью объясняет проблему.
@ jfriend00, сэр, извините, что снова побеспокоил вас, несмотря на этот тупик. Ответ объясняет все, но, поскольку я новичок, я не знаю, как реализовать обратный вызов в моем случае. Было бы здорово, если бы вы уделили немного времени написанию кода для моего случая.
Во-первых, вам, вероятно, следует использовать обещание вместо простого обратного вызова, поскольку это современный способ делать асинхронные вещи в node.js. Во-вторых, в вашем ответе есть примеры реализации как обратных вызовов, так и обещаний. Если вы напишете какой-то код, чтобы следовать этим примерам, и при этом застряли, вам следует написать новый вопрос и опубликовать код, который вы пробовали, и объяснить, где вы застряли. У нас нет причин восстанавливать все ранее пройденные пути.
@ jfriend00 хорошо, спасибо
@ jfriend00, сэр, не могли бы вы проверить мой вопрос





Асинхронные результаты НЕ МОГУТ быть возвращены синхронно (что вы и пытаетесь сделать). Это вопрос времени. Ваша функция возвращается ДО того, как будут доступны асинхронные результаты, поэтому вы увидите пустой массив.