1

我多次调用 POST 以便在服务器上创建对象。POST 包含在一个承诺中。我创建了一组 promise 并将其传递给 Q.all 但是当它被解析时,数组中的所有对象都具有相同的 id,并且在服务器上只创建了一个对象。

这是我的代码

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),那么服务器似乎无法正确处理多个同时请求。关闭异步后,请求实际上被迫按顺序处理。

理想的解决方案可能是在服务器上修复问题,但是应用更好的客户端“sequentializer”修复可能是可以接受的

代码遵循一个相当熟悉的模式:

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()。你可能需要玩一些。

脚注

此修复可确保每个用户的请求是连续的。但是,服务器上的错误将仍然存在。只有修复服务器上的任何问题,才能确保来自两个或多个用户的并发请求不会出现问题;即可以发出重复的ID。这不一定会在测试期间发生,并且可能是一个潜在的错误,直到将来某个时间,当两个用户同时访问此特定资源时才会显现出来。

因此,仅当只有一个用户可以同时访问资源(以及潜在的类似资源)时,上述修复才适用。为了安全起见,您需要在服务器上采取措施以确保不会发生对资源的多个并发访问。修复实际错误几乎毫无疑问更容易 - 即确保不能多次发出相同的 id。

因此,我重申上述解决方案可能只是可接受的。

于 2013-06-20T23:27:19.350 回答