簡體   English   中英

刷新jQuery.ajax()中的提取函數

[英]Rewite fetch function in jQuery.ajax()

當前使用提取的解決方案

目前,我們已經實現了該功能,並且運行良好。

function setupCKConnect() {

    fetch('ajax/myfile.php?id=1234567')
        .then(response => { 
            response.json()
        .then(json => {
            function1(json)
        .then(data => {
            function2()
        })
        .catch(data => {
            setupCKConnect()
        });
      });
    });

  };

上面代碼的解釋

  • 對myfile.php的ajax調用檢索在function1()中使用的json響應。
  • 然后function1()偵聽來自另一個功能的回調(有時長達10分鍾)
  • 在function1()收到回調並執行后,function2()輪詢數據庫以獲取結果。

為什么我們需要改變

不幸的是,我們的客戶群中似乎有很大一部分使用的設備不支持訪存。

因此,我試圖使用jQuery.ajax()重寫此代碼。

我知道這似乎在倒退,但是在這種情況下是有必要的。

新密碼

下面是我到目前為止的代碼。 請注意,我沒有嫁給jQuery,因為有人可以提供更好的選擇。

到目前為止,我有以下代碼:

function setupCKConnect() {

    $.ajax({
        type: "GET",
        dataType: 'json',
        url: 'ajax/myfile.php?id=1234567'
    }).done(function(data) {  
        function1(data)
    }).done(function() {  
        function2()
    }).fail(function(jqXHR, textStatus, errorThrown) {  
        setupCKConnect()
    });

};

新代碼的問題

新代碼實際上工作得很好,除了一點點

  • function2()立即執行,而不是等待function1()完成。

任何人都可以幫助解釋如何在function1()完成之前停止function2()的執行

協助表示贊賞

因此,ajax響應返回一個延遲的對象,而不是一個promise。 這些看起來很相似,但是將兩者混為一談就可以了。 我已經基於deferred.done文檔創建了一個js小提琴來說明我的意思。

我敢冒險猜測function1(json)返回一個promise。 延遲者獲取值(未解決的承諾)並認為“讓我們繼續前進”,您要么需要異步/等待,要么調用該函數,然后暫停執行其他任何操作。

如果您修復了原始代碼的縮進,您將看到問題。 要調用function2()不在.then()多數民眾贊成鏈接到第一個.then()它被稱為上的結果function1() 而且.catch()也從那里被調用,而不是從fetch() .catch()被調用,因此您不能使用.fail()作為替代。

function setupCKConnect() {
  fetch('ajax/myfile.php?id=1234567')
    .then(response => {
      response.json()
        .then(json => {
          function1(json)
            .then(data => {
              function2()
            })
            .catch(data => {
              setupCKConnect()
            });
        });
    });
};

因此,您需要類似地構造jQuery代碼。

function setupCKConnect() {
    $.ajax({
        type: "GET",
        dataType: 'json',
        url: 'ajax/myfile.php?id=1234567'
    }).done(function(data) {  
        function1(data)
            .then(function(data) {
                function2()
            })
            .catch(function() {  
                setupCKConnect(data)
            });
    })
};

假定function1()與原始版本相似,因此它會返回一個promise。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM