1

サーバー上にオブジェクトを作成するために、POST を複数回呼び出しています。POST は promise でラップされています。promise の配列を作成して Q.all に渡しますが、解決されると、配列内のすべてのオブジェクトが同じ ID を持ち、サーバー上にオブジェクトが 1 つだけ作成されます。

これが私のコードです

for (var i = txArray.length - 1; i >= 0; i--) {                
  txArray[i]._action = 'update';
  promises.push(newVertex(url));
};
return Q.all(promises).then(function(result){
  console.log(result);
});

function newVertex(url) {
    var deferred = Q.defer();
    var xhr;

    try {
        xhr = new_xhr();
    } catch (e) {
        deferred.reject(-1);
        return deferred.promise;
    }

    xhr.open('POST', url, true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                deferred.resolve(xhr.responseText);
            } else {
                deferred.reject(xhr);
            }
        }
    };

    xhr.send();
    return deferred.promise;
}

結果は、すべて同じ ID を持つオブジェクトを返します。なぜかわからない?誰にも提案はありますか。

4

2 に答える 2

2

私はこの問題を解決することができました。POST には、Content-Type:application/json のヘッダーがありました。したがって、サーバーは何らかのデータが渡されることを期待していました。いくつかの json データまたは '{}' を渡すことで問題が解決しました。

例えば:

xhr.send('{}');

すべての体のフィードバックに感謝します, それはすべて役に立ちます.

于 2013-06-22T04:05:21.350 に答える
-1

ですべてxhr.open('POST', url, false)が正常に機能する場合、サーバーが複数の同時要求を適切に処理していないように見えます。async をオフにすると、リクエストは効果的に強制的に順番に処理されます。

理想的な解決策は、おそらくサーバーで問題を修正することです、より適切なクライアント側の「シーケンサライザー」修正を適用しても問題ない場合があります。

コードはかなりおなじみのパターンに従います。

var promise = Q.defer().resolve().promise;//A ready-resolved seed promise.

//Now, instead of pushing promises onto an array, progressively build a .then() chain.
for (var i = txArray.length - 1; i >= 0; i--) {                
    txArray[i]._action = 'update';
    promise = promise.then(function() {
        return newVertex(url);
    });
};

//And add a terminal .then() to do whatever on completion of the sequence.
promise.then(function(result) {
    console.log(result);
});

これは(つまり、非同期リクエスト)xhr.open('POST', url, true);で使用できます。newVertex()

最後の についてはよくわかりません.then()。あなたはそれでいくつか遊ぶ必要があるかもしれません。

脚注

この修正により、各ユーザーのリクエストが順次処理されるようになります。ただし、サーバー側のバグは残ります。サーバーの問題を修正することによってのみ、2 人以上のユーザーからの同時要求が問題を引き起こさないようにすることができます。つまり、重複した ID が発行される可能性があります。これは、テスト中に必ずしも発生するとは限りません。将来、2 人のユーザーがこの特定のリソースに同時にアクセスするまで顕在化しない潜在的なバグである可能性があります。

したがって、上記の修正は、 1 人のユーザーのみがリソース (および場合によっては同様のリソース) に同時にアクセスできる場合にのみ適切です。安全のために、リソースへの複数の同時アクセスが発生しないように、サーバーで対策を講じる必要があります。実際のバグを修正する方がほぼ間違いなく簡単です。つまり、同じ ID を複数回発行できないようにすることです。

したがって、上記の解決策のみ受け入れられる可能性があることを繰り返します。

于 2013-06-20T23:27:19.350 に答える