Javascript 如何同步链接jQuery的顺序

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

我将3个ajax请求链接到RESTful端点:

  • 放置一些数据(返回{}和OK)
  • 获取我刚刚输入的数据
  • 显示数据
  • 我已经使用
    .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的建议。