Q.all()承诺不能正确解析延迟承诺



为了在服务器上创建对象,我多次调用POST。POST被封装在一个promise中。我创建了一个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的对象。不知道为什么?谁有什么建议?

我已经设法解决了这个问题。POST有一个标题Content-Type:application/json。因此,服务器期望将一些数据传递给它。通过一些json数据甚至'{}'解决了这个问题。

例如:

xhr.send('{}');

感谢大家的反馈,这些都很有帮助。

如果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()。你可能需要玩弄一下它。

脚注

此修复确保每个用户的请求是顺序的。但是,服务器端的错误将继续存在。只有通过修复服务器上的任何错误,才能确保来自两个或更多用户的并发请求不会出现问题;也就是说,可以发出重复的id。这在测试期间不一定会发生,并且可能是一个潜在的错误,直到将来某个时候两个用户同时访问这个特定的资源时才会显示出来。

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

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

相关内容

  • 没有找到相关文章

最新更新