Javascript 如何同步链接jQuery的顺序
我将3个ajax请求链接到RESTful端点:Javascript 如何同步链接jQuery的顺序,javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,我将3个ajax请求链接到RESTful端点: 放置一些数据(返回{}和OK) 获取我刚刚输入的数据 显示数据 我已经使用.then()建立了一系列承诺。但是请求并不是按照预期的顺序(1,2,3)发生的,而是以OPTIONS请求开始的(2,1) 为什么它们没有按预期顺序发生? var _id = x; function doReqs() { putData(_id, data) .then(getData(_id)) .then(showData); } // retur
.then()
建立了一系列承诺。但是请求并不是按照预期的顺序(1,2,3)发生的,而是以OPTIONS
请求开始的(2,1)
为什么它们没有按预期顺序发生?
var _id = x;
function doReqs() {
putData(_id, data)
.then(getData(_id))
.then(showData);
}
// returns empty object {}
function putData(id, data) {
return $.ajax({
method: 'PUT',
url: http://xxx,
contentType: 'application/json'
});
}
// returns JSON {"data": {"xx": "xx}}
function getData(id) {
return $.ajax({
method: 'GET',
url: http://xxx
});
}
function showData(data) {
console.log(data);
}
如何确保顺序正确?
var _id = x;
function doReqs() {
putData(_id, data)
.then(getData(_id))
.then(showData);
}
// returns empty object {}
function putData(id, data) {
return $.ajax({
method: 'PUT',
url: http://xxx,
contentType: 'application/json'
});
}
// returns JSON {"data": {"xx": "xx}}
function getData(id) {
return $.ajax({
method: 'GET',
url: http://xxx
});
}
function showData(data) {
console.log(data);
}
在此代码中:
function doReqs() {
putData(_id, data)
.then(getData(_id))
.then(showData);
}
.then(getData(_id))
部分完全错误。这是错误的,有两个原因
.then()
应该被传递一个函数引用。当您传递getData(_id)
时,您将立即执行该函数,并将该函数(一个jqXHR对象)的返回值传递给。然后()。这不是您应该传递给.then()
的内容
getData(\u id)
,因此它将无法在承诺链序列中正确执行func()
及其后面的参数作为参数传递时,它都会立即执行该函数并将其返回值作为参数传递。这不是您想要的。然后()
,原因如下
如果您试图控制传递给getData()
的内容,那么您可以确保从putData()
返回正确的内容,因为这是传递给getData()
的内容,或者您可以创建一个存根函数来传递正确的内容:
function doReqs() {
putData(_id, data)
.then(function() {
return getData(_id);
})
.then(showData);
}
或者,您可以这样做:
function doReqs() {
putData(_id, data)
.then(getData.bind(null, _id))
.then(showData);
}
或者,由于
putData()
的解析值将作为参数传递给承诺链中的下一步(即getData
),因此可以执行以下操作:
function putData(id, data) {
return $.ajax({
method: 'PUT',
url: http://xxx,
contentType: 'application/json'
}).then(function() {
// make sure putData passes the id to the next step in the chain
return id;
});
}
function doReqs(id) {
putData(id, data)
.then(getData)
.then(showData);
}
下面是一个链接的工作示例:
功能延迟(t,val){
返回新承诺(函数(解析){
setTimeout(resolve.bind(null,val),t);
});
}
函数优先(arg){
log(“首先运行…”,arg=“,arg”);
返回延迟(500,10);
}
函数秒(arg){
log(“正在运行第二个…,arg=,arg”);
返回延迟(100100);
}
第三功能(arg){
log(“正在运行第三个…”,arg=“,arg”);
}
首先(1),然后(第二),然后(第三)代码>注释不用于扩展讨论;此对话已结束。我如何访问聊天?感谢您的详细解释。特别是关于如何以及如何在中传递内容。然后(xx)
。现在我了解了如何确定ajax请求的执行顺序。最后,我在putData()上使用了您最后一个返回id的建议。