gpt4 book ai didi

javascript - 如何在 Node js中创建异步回调?

转载 作者:搜寻专家 更新时间:2023-10-31 23:59:44 25 4
gpt4 key购买 nike

var express = require('express');
var GoogleUrl = require('google-url');
var favicon = require('serve-favicon');
var mongo = require('mongodb').MongoClient;
var app = express();
var db;
var googleUrl = new GoogleUrl({key: 'AIzaSyB5i1sdnt6HwzrvsPTBu0FbPiUZrM_BCsk'});
var PORT = 8080;

mongo.connect('mongodb://localhost:27017/url-shortener', function(err, newDb){
if(err){
throw new Error('Database failed to connect');
} else{
console.log('Successfully connected to MongoDB on port 27017');
}
db=newDb;
db.createCollection('sites', {
autoIndexID: true
});
});

app.use(favicon(__dirname+'/public/favicon.ico'));

app.get('/new/*', function(req, res){
var doc;
console.log('This is the url: '+req.params[0]);
googleUrl.shorten(req.params[0], function(err, shortUrl){
if(err){
console.log(err);
}else{
console.log(shortUrl);
}
doc = check_db(req.params[0], shortUrl, db);
});

下面的 res.json 语句在其他函数有机会返回值之前运行并返回一个 undefined variable 。

   res.json(doc);
});


app.listen(process.env.PORT, function(){
console.log('Express listening on: '+PORT);
});

function check_db(longUrl, shortUrl, db){
db.collection('sites').findOne({
'longUrl': longUrl,
'shortUrl': shortUrl
}, function(err, doc){
if(err){
console.log(err);
}if(doc){

res.json 语句在下面的语句执行之前执行,并且可以返回一个值。

            console.log('This site already exists on the database');
return doc;
}else{
save_db(longUrl, shortUrl, db);
}
});

}

function save_db(longUrl, shortUrl, db){
db.collection('sites').insert({
'longUrl': longUrl,
'shortUrl': shortUrl
}, function(err, doc){
if(err){
throw err
}else{
console.log(doc);
}
db.close();
});
}

在上面的代码中,res.json 语句在 GET 请求下定义的函数有机会完成执行之前执行,结果 res.json 返回一个 undefined variable 。我知道我必须在我的应用程序中实现异步功能(可能是 promise ?),但我完全不知道该怎么做!

最佳答案

回调只是函数调用中的一个参数,所以

googleUrl.shorten(req.params[0], function(err, shortUrl){
if(err){
console.log(err);
}else{
console.log(shortUrl);
}
doc = check_db(req.params[0], shortUrl, db);
});
res.json(doc);

行为就像

foo(a, b);
bar();

您调用 #googleUrl.shorten() 之后会立即调用 #res.json(),就像调用 #foo () 之后立即调用 #bar()

你的回调函数:

function(err, shortUrl){
if(err){
console.log(err);
}else{
console.log(shortUrl);
}
doc = check_db(req.params[0], shortUrl, db);
}

异步执行,这意味着它不会中断常规控制流。当您需要推迟执行像 #res.json(doc) 这样的语句时,您必须确保它的执行也脱离了常规控制流。为此,您需要在 #check_db()#save_db() 中接受回调参数。新的函数签名将如下所示:

function save_db(longUrl, shortUrl, db, callback)

function check_db(longUrl, shortUrl, db, callback)

然后传递一个回调函数,它接受参数 'doc',并执行 res.json(doc) 到你的数据库职能。例如:

doc = check_db(req.params[0], shortUrl, db, function(doc){
res.json(doc);
});

注意:您只需将“回调”从#check_db()传递给#save_db()>.

最后,一旦您的异步函数完成执行,调用回调,而不是返回一个值。例如:

db.collection('sites').findOne({
'longUrl': longUrl,
'shortUrl': shortUrl
}, function(err, doc){
if(err){
console.log(err);
}if(doc){
console.log('This site already exists on the database');
callback(doc);
}else{
save_db(longUrl, shortUrl, db, callback);
}
});

我已将对 #save_db() 的更改留给您。祝你好运!

关于javascript - 如何在 Node js中创建异步回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com