Javascript Q.all()承诺无法正确解析延迟承诺
为了在服务器上创建对象,我多次调用POST。这封信是用诺言包装的。我创建了一个承诺数组并将其传递给Q.all,但当它被解析时,数组中的所有对象都具有相同的id,并且在服务器上只创建了一个对象 这是我的密码Javascript Q.all()承诺无法正确解析延迟承诺,javascript,promise,q,Javascript,Promise,Q,为了在服务器上创建对象,我多次调用POST。这封信是用诺言包装的。我创建了一个承诺数组并将其传递给Q.all,但当它被解析时,数组中的所有对象都具有相同的id,并且在服务器上只创建了一个对象 这是我的密码 for (var i = txArray.length - 1; i >= 0; i--) { txArray[i]._action = 'update'; promises.push(newVertex(url)); }; return Q.al
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的对象。不确定为什么?有人有什么建议吗。如果使用
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,直到将来某个时候,当两个用户同时访问这个特定的资源时才会显现出来
因此,只有一个用户可以同时访问资源(以及潜在的类似资源)时,上述修复才是合适的。为了安全起见,您需要在服务器上采取措施,以确保不会发生对资源的多个并发访问。几乎毫无疑问,修复实际的bug更容易——即确保同一id不能被多次发布
因此,我重申,上述解决方案只有才是可接受的。如果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,直到将来某个时候,当两个用户同时访问这个特定的资源时才会显现出来
因此,只有一个用户可以同时访问资源(以及潜在的类似资源)时,上述修复才是合适的。为了安全起见,您需要在服务器上采取措施,以确保不会发生对资源的多个并发访问。几乎毫无疑问,修复实际的bug更容易——即确保同一id不能被多次发布
因此,我重申,上述解决方案只有才是可以接受的。我已经设法解决了这个问题。这篇文章有一个内容类型为application/json的标题。因此,服务器希望向其传递一些数据。通过传递一些json数据甚至“{}”解决了这个问题
例如:
xhr.send('{}');
谢谢大家的反馈,一切都很有帮助。我已经设法解决了这个问题。这篇文章有一个内容类型为application/json的标题。因此,服务器希望向其传递一些数据。通过传递一些json数据甚至“{}”解决了这个问题
例如:
xhr.send('{}');
感谢大家的反馈,这一切都很有帮助。刚刚发现如果我将false传递给xhr.open('POST',url,false);它起作用了。为什么?我可以这样留着吗?这个代码看起来不错。这可能是您的服务器中的竞争条件吗?@barcrab它工作的唯一原因是因为您正在关闭async,这在完成之前不会让任何事情发生。这样不好。它“似乎”起作用,但并不是承诺起作用。只是您没有异步地执行这些操作。请尽快添加console.log(xhr.responseText)
,您应该会发现实际上是服务器出了故障。这与承诺代码无关。我seccond@ForbesLindesay,这个代码看起来是正确的,问题在于服务器。添加false
是一个坏主意,因为它会在请求完成时锁定UI;它起作用了。为什么?我可以这样留着吗?这个代码看起来不错。这可能是您的服务器中的竞争条件吗?@barcrab它工作的唯一原因是因为您正在关闭async,这在完成之前不会让任何事情发生。这样不好。它“似乎”起作用,但并不是承诺起作用。只是您没有异步地执行这些操作。请尽快添加console.log(xhr.responseText)
,您应该会发现实际上是服务器出了故障。这与承诺代码无关。我seccond@ForbesLindesay,这个代码看起来是正确的,问题在于服务器。添加false
i