使用javascript进行回调
问题描述:
我使用javascript和nodejs创建项目。我在我的函数里面为循环集成了回调函数,但是我无法做到这一点。我的问题是回调在循环的第一次迭代完成。这里是我的代码:使用javascript进行回调
function tagEndpointNames(callback) {
var data = userGenerateToken();
var sql = "SELECT * FROM topology_data WHERE topology_coordinates !='' and topology_uuid is not null"
var query = conn.query(sql, function(err, tagEndpointNames) {
for (var i = 0; i < tagEndpointNames.length; i++) {
var topologytagData = {
"topology_tag": tagEndpointNames[i].topology_uuid
}
var tpCooridinates = JSON.parse(tagEndpointNames[i].topology_coordinates);
for (var j = 0; j < tpCooridinates.stageObjects.length; j++) {
if (tpCooridinates.stageObjects.length) {
if (tpCooridinates.stageObjects[j].endPointId) {
if (isGuid(tpCooridinates.stageObjects[j].endPointId)) {
var endPointUUID = tpCooridinates.stageObjects[j].endPointId;
var _ro = require('request');
var url = url;
var _d = '';
_ro({
url: url,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + data['access_token']
},
json: topologytagData
}, function(_e, _r, _b) {
if (_r.statusCode == 200 && !_e) {
callback()
//return;
} else {
callback()
console.log("andarss")
return;
}
})
}
}
}
}
}
})
}
下面是函数调用:
tagEndpointNames(function(){
console.log ('Server Closed during MIGRATION JOB 4');
server.close(function() {
process.exit(0);
});
})
答
当您正在运行的异步过程与回调在for循环中,请记住,从被叫回调将在第一被解雇事件在循环内完成。你的情况request
lib call是一个for循环内部的异步进程,你需要处理所有请求调用的所有回调,然后才能回调被调用者。
答
Node的async库将帮助您完成这类任务。
使用异步瀑布。它运行一系列函数,每个函数都将结果传递给数组中的下一个。但是,如果任何函数向回调传递错误,则不执行下一个函数,并立即调用主回调并返回错误。
JS
var create = function (req, res) {
async.waterfall([
_function1(req),
_function2,
_function3
], function (error, success) {
if (error) { alert('Something is wrong!'); }
return alert('Done!');
});
};
function _function1 (req) {
return function (callback) {
var something = req.body;
callback (null, something);
}
}
function _function2 (something, callback) {
return function (callback) {
var somethingelse = function() { // do something here };
callback (err, somethingelse);
}
}
function _function3 (something, callback) {
return function (callback) {
var somethingmore = function() { // do something here };
callback (err, somethingmore);
}
}
你的代码格式让我的大脑出血,当我尝试阅读 –
我认为你是在这两个的if/else条件时,利用回调。 –
你是什么意思'var url = url;'? –