所以。
我有一个关于处理对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
});

10-02 18:07