Javascript Q.all()承诺无法正确解析延迟承诺

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

为了在服务器上创建对象,我多次调用POST。这封信是用诺言包装的。我创建了一个承诺数组并将其传递给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的对象。不确定为什么?有人有什么建议吗。

如果使用
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