2017-07-12 164 views
2

我想知道是否有更好的方法在JavaScript中執行異步循環?我一直在使用下面的遞歸方法,但我覺得可能有一個更清晰的方法。任何鏈接/建議將不勝感激。由於JavaScript異步循環

var titles = ['Test 1', 'Test 2', 'Test 3']; 
var i = 0; 
addColumns(); 

function addColumns() { 
    if (i < titles.length) { 
     var data = { 
      '__metadata': { 'type': 'SP.FieldText' }, 
      'FieldTypeKind': 3, 
      'Title': titles[i], 
      'MaxLength': '22' 
     }; 

     postToSP.createColumns(baseURL, listName, data) 
      .then(function() { 
       i++; 
       addColumns(); 
      }) 
      .catch(function(e){ 
       console.log('Error: ' + e); 
      }) 
    } else { 
     return; 
    }; 
}; 
+1

爲什麼這些調用需要按順序執行?命令是重要的嗎? –

+0

它們不需要按順序排列,但ShrePoint在嘗試同時寫入全部3個時會引發錯誤 –

+1

好的。那麼肯定會在我的回答中使用第一種模式,因爲下一次呼叫將不會被啓動,直到前一次往返。第二次試圖同時做到這一點。 –

回答

4

假設處決值無關(即一個不依賴於前一個的值),但連續的(他們必須往返於確定的順序完成):

var allDone = titles.reduce((prev, title) => { 
    var data = { 
    '__metadata': { 'type': 'SP.FieldText' }, 
    'FieldTypeKind': 3, 
    'Title': title, 
    'MaxLength': '22' 
    }; 
    return prev.then(_ => postToSP.createColumns(baseURL, listName, data)); 
}, Promise.resolve(true)); 

這將排隊一系列ajax請求,只有在前一個請求完成後纔會啓動。錯誤處理作爲練習留給讀者。如果調用必須按照一定的順序來完成,這是乾淨多了這種方式:

let allDone = Promise.all(titles.map(title => postToSP.createColumns...)); 

不管怎樣,現在你已經有了一個單一的承諾,將解決當所有的異步調用完成。