所以。
我有一个关于处理对azure数据库的windowsazure移动服务异步调用的问题。
现在,我发布了一个带有数组的对象,然后在我的wams api端点中循环。
循环获取数组中的当前对象,并将其与数据库的唯一id一起推送到一起。这将从最后插入的行返回行id,在回调中,我将获取该行id并实例化另一个异步调用。
在这里,我将插入最后插入的行id,以及数组当前循环中对象的一组属性。
然而,这似乎表现得很奇怪,并在第二个异步调用的所有列中插入相同的信息。
for (var i = 0; i < object.array.length; i++) {
var mssql = request.service.mssql,
prop1 = object.array[i].prop1,
prop2 = object.array[i].prop2,
user = object.user.userid;
mssql.query("exec stored_procedure ?, ?", [user, prop1], {
success: function (res) {
var insertedid = res[0];
if (typeof insertedid === 'undefined') {
return;
} else {
insertedid = insertedid.ID;
}
mssql.query("exec stored_procedure_2 ?, ?", [insertedid, prop2], {
//success
});
}
});
}
我可能做了一些完全错误的事情,因为我不太喜欢我所做的,但是考虑到我对node.js的熟悉,就这样了。
最佳答案
下面是async.js的一个可能实现。如果您有两个以上的属性,您将需要动态地生成“insertpropx”函数,但这应该可以让您开始。
var mssql = request.service.mssql;
var user = object.user;
function insertProp1(obj, cb) {
mssql.query("exec stored_procedure ?, ?", [user.userid, obj.prop1], {
success: function (res) {
var inserted = res[0];
if (!inserted) {
return cb('prop1 not inserted for userid: ' + user.userid);
}
// pass the ID and the object to the next
// function in the "waterfall" chain
cb(null, inserted.ID, obj);
}
});
}
function insertProp2(id, obj, cb) {
mssql.query("exec stored_procedure_2 ?, ?", [id, obj.prop2], {
success: function (res) {
var inserted = res[0];
if (!inserted) {
return cb('prop2 not inserted for id: ' + id);
}
// since this is the last function in
// the "waterfall" chain, we don't need
// to pass anything along
cb(null);
}
});
}
// for each object in the array...
async.each(object.array, function iterator (obj, cb) {
// insert properties in order, passing the
// insertion ID as an argument
async.waterfall([
insertProp1.bind(null, obj),
insertProp2
], cb);
}, function allDone (err) {
if (err) {
console.log(err);
}
// all done
});