1

以下に示すテーブルスクリプトを読み取るために、パラメーターでクエリを実行し、結果ごとに異なるテーブルの値を結果に追加しようとしています。ただし、azureは非同期であるため、getInvitesの前にrequest.respond()が常に呼び出されます。つまり、結果に招待が追加されることはありません。

function read(query, user, request) {

    request.execute({
        success: function (results) {
            for (var i = 0; i < results.length; i++) {
                getInvites(results[i].id, function (invites) {
                    console.log("Assigning results.invites"); //runs second
                    results[i].invites = invites;
                });
            }
            console.log("Request Responding"); //runs first
            request.respond();
        }
    });

}

function getInvites(id, cb) {
    var InvitesTable = tables.getTable("Invites").where({
        "PlanID": id
    }).select("UserID", "Attending");
    InvitesTable.read({
        success: function (results) {
            if (cb) cb(results);
        }
    });
}

Azureで外部ライブラリを使用できないため、これはこれからのフォローアップの質問です。では、どうすれば問題を回避できますか?

4

2 に答える 2

4

操作の非同期性により、これは少し困難です。あなたがする必要があるのはrequest.respond()、すべての操作が完了した後にのみ呼び出すことです。await私はC#が大好きなキーワードが本当に恋しいですが、以前は「非同期forループ」を使用したことがあり、非常にうまく機能しています。コードは次のようになります。

function read(query, user, request) {
    request.execute({
        success: function (results) {
            var index = 0;
            var executeStep = function() {
                if (index === results.length) {
                    // all invites have been retrieved
                    console.log("Request Responding");
                    request.respond();
                } else {
                    getInvites(results[index].id, function(invites) {
                        console.log('Assigning results.invites');
                        results[i].invites = invites;
                        index++;
                        executeStep();
                    });
                }
            }

            executeStep();
        }
    });
}

function getInvites(id, cb) {
    var InvitesTable = tables.getTable("Invites").where({
        "PlanID": id
    }).select("UserID", "Attending");
    InvitesTable.read({
        success: function (results) {
            if (cb) cb(results);
        }
    });
}
于 2013-01-17T03:33:38.953 に答える
0

わかりました、あなたはこのようなことをするかもしれません

function read(query, user, request) {

    request.execute({
        success: function (results) {
            for (var i = 0, len = results.length; i < len; i++) {
                getInvites(results.id, function (invites) {
                    console.log("Assigning results.invites"); //runs second
                    results.invites = invites;

                    if (i === len-1) request.respond();
                });
            }
            console.log("Request Responding"); //runs first
        }
    });

}

function getInvites(id, cb) {
    var InvitesTable = tables.getTable("Invites").where({
        "PlanID": id
    }).select("UserID", "Attending");
    InvitesTable.read({
        success: function (results) {
            if (cb) cb(results);
        }
    });
}

これは基本的request.respond()に、最後の反復のコールバックが成功したときに呼び出されることを意味します。

于 2013-01-16T15:21:49.630 に答える