2015-01-14 48 views
0

我在循環和對象數組後發送AJAX調用時遇到問題。代碼如下用jQuery發送另一個AJAX調用

var def = true; 
    $.each(urls, function(index, val) { 
     var postResult = $.Deferred(); 
     link = 'http://myurl.com' + val.aslug + '/' + val.slug; 
     $.when(def).then(function(){ 
       $.post('https://graph.facebook.com ', {id : link, scrape : 'true' }, function(data, textStatus, xhr) { 
       }).always(function(){ 

        postResult.resolve(5); 
       }); 

     }); 
     def = postResult; 
    }); 

問題是第一個和第二個調用他們都沒問題。但第三個電話和以下內容與第二個電話相同:/我認爲每個都不會更改爲下一個對象

+2

我們可以看到什麼定義'urls'? –

+0

爲什麼'postResult.resolve(5);'? – dfsq

+2

與論壇網站不同,我們不使用「謝謝」或「任何幫助表示讚賞」,或在[so]上簽名。請參閱「[應該'嗨','謝謝',標語和致敬從帖子中刪除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be - 刪除 - 從帖子) –

回答

2

在這種情況下,最簡單的方法是: 在「when-然後「建設。

var def = true; 
$.each(urls, function(index, val) { 
    var postResult = $.Deferred(); 

    $.when(def).then(function(){ 
      var link = 'http://myurl.com' + val.aslug + '/' + val.slug; 
      $.post('https://graph.facebook.com ', {id : link, scrape : 'true' }, function(data, textStatus, xhr) { 
      }).always(function(){ 

       postResult.resolve(5); 
      }); 

    }); 
    def = postResult; 
}); 

你得到這個問題是因爲JS異步能力。 $ .each() - 循環根本不會等待您的「延遲代碼片段」運行。它循環通過你的數組並創建一個將被執行的任務隊列。你

也可以考慮使用$.AJAX與選項async:False,而不是

+0

謝謝,這是指定變量鏈接的問題。 – Weinz

1

你的直覺是正確的 - 最大的問題是,你不希望創建一個循環內的功能。在$.when第二次解決時,您的link變量將不再引用正確的值。這就是爲什麼你要調用相同的URL。

此外,創建承諾的順序,你會想用這樣的:https://github.com/kriskowal/q#sequences(不知道是否jQuery的承諾具有可比性功能)

示例代碼:

// not sure if this is necessary 
// haven't used jQuery promises much 
var result = $.when(true); 

mapUrlsToPosts(urls).forEach(function(f) { 
    result = result.then(f); 
}); 

function mapUrlsToPosts(urls) { 
    return urls.map(function(url) { 

    // create a function that when executed will make a request to the desired url 
    return post.bind(null, url); 
    }); 
} 

function post(val) { 
    var link = 'http://myurl.com' + val.aslug + '/' + val.slug, 
     postResult = $.Deferred(), 
     params = { 
     link: link, 
     scrape: 'true' 
     }; 

    $.post('https://graph.facebook.com ', params, function(data, textStatus, xhr) { 
    }).always(function(){ 
     postResult.resolve(5); 
    }); 

    return postResult; 
} 

編輯:順便說一句,如果你不需要等待先前的請求完成下一步之前完成所有這些可以變得更簡單。這裏的大部分複雜性來自排隊請求。