2014-03-04 116 views
1

我想在while或for循環中調用jsonpcallback函數。但我得到異步結果。如何在jsonpcallback中實現這一點。請幫助我解決這個問題或提供任何其他解決方案。如何獲得jsonpCallback的同步結果?

window.onPublitoryOebPart = function(json) { 
    window.publitoryOebPartJson = json; 
    content = patchEditedContent(json); 
    saveOebPartToc(content); 
} 
i = 0; 
while(i < $("#oeb_parts_count").val()) { 
    return unless $("#oeb-part-file-url-"+i).length > 0 
    fileUrl = $("#oeb-part-file-url-"+i).html(); 
    $.ajax({ 
     url: fileUrl, 
     crossDomain: true, 
     dataType: "script", 
     jsonpCallback: "onPublitoryOebPart" 
    }) 
    i++; 
} 

回答

0

的JavaScript 不能得到一個 「同步」 JSONP結果。這是因爲JSONP涉及創建一個新的腳本元素;這種動態創建的腳本元素只能異步加載資源。

的JSONP請求剛剛use the success callback和處理響應異步。如果服務不允許指定動態函數,手動指定jsonpCallback僅爲必需/有用。

如果在循環中使用success回調,則對read up on closures(然後read more)也很重要。

例如:

var i = 0; // Don't forget the "var" 
while(i < $("#oeb_parts_count").val()) { 
    var elm = $("#oeb-part-file-url-"+i); 
    if (!elm.length) { return; } // Make sure to use valid syntax 
    var fileUrl = elm.html(); 
    $.ajax({ 
     url: fileUrl, 
     crossDomain: true, 
     dataType: "script", 
     success: function (i, fileUrl) { 
      // Return a closure, the i and fileUrl parameters above 
      // are different variables than the i in the loop outside. 
      return function (data) { 
       // Do callback stuff in here, you can use i, fileUrl, and data 
       // (See the links for why this works) 
       alert("i: " + i + " data: " + data); 
      }; 
     })(i, fileUrl) // invocation "binds" the closure 
    }); 
    i++; 
} 

這可能是更清潔簡單地通過創建一個名爲功能的關閉,但是這一切都同一個概念。


同步XHR請求也非常不鼓勵; XHR是而不是 JSONP,即使這些請求也是使用jQuery.ajax函數創建的。

+0

那麼如何做到這一點?有可能在jsonpcallback函數中傳遞i值嗎? – user2138489

+0

@ user2138489只需使用'success'回調(jQuery將合成代理函數)並異步處理結果*。您可能還需要閱讀關閉,但最終結果是相同的 - JSONP *必須*異步使用。 – user2864740

+0

是的,我嘗試了成功,但它沒有鍛鍊。但我不確定我的嘗試是否正確。我只是在成功函數中給出了alert json,但卻沒有定義 – user2138489