2017-03-08 14 views
0

我有一些項目需要發佈到我的服務器。我試過以下,但i永遠不會迭代。如何堆疊請求調用,以使它們在完成之前不能完成?

var i = 0; 
while (i < numOfItems) { 
    var item = items[i]; 
    var a; 
    for(var ik in item){ 
     console.log(item[ik]); 
     a = item[ik]; // Gets the key 
     break; 
    }   

    var formData = { 
     ID : ID, 
     UID : UID, 
     item : a 
    } 
    request.post({url:'http://example.com/a', formData: formData}, function(err, httpResponse, body){ 
     if (err) { 
      return console.error('Post failed:', err); 
     } 
     console.log('Post successful! Server responded with:', body); 
     i++; 
    }); 
} 
+0

只是好奇,爲什麼''break'在''for'loop?除此之外,誰是'request'對象? – Manu

+0

@Manu防止'a'被定義爲'undefined' – user82395214

回答

1

由於request.post是異步的,您的代碼將不起作用。如果您的目標是打電話給陣列中的每個元素,那麼可以使用Promises.all()工作和更優雅的解決方案。

這裏的修改你的代碼的承諾 -

function postRequest(url, formData) { 
    return new Promise((resolve, reject) => { 
     request.post({ url, formData }, function (err, httpResponse, body) { 
      if (!error) { 
       resolve({ message: 'Post successful!', response: body }); 
      } else { 
       reject(err); 
      } 
     }); 
    }) 
} 

// Map your data array to an array of Promises 
let promises = yourArray.map(element => { 
    let formData = { 
     ID: ID, 
     UID: UID, 
     item: element 
    } 
    return postRequest({ url: 'http://example.com/a', formData: formData }) 
}); 

// Wait for all Promises to complete 
Promise.all(promises) 
    .then(results => { 
     // Handle results 
    }) 
    .catch(e => { 
     // Handle error 
    }); 

有幾件事情需要注意 -

  1. 我重用領域IDUID原樣,因爲它是不明確的地方他們來自你的代碼。使用包含數據項的數組替換yourArray
+0

如果我不使用let,它應該起作用嗎?由於Firebase的原因,我無法使用「--use_strict」。當我使用'var'而不是'let'時,出現'ReferenceError:error is not defined'錯誤。 '/ a'永遠不會被調用。 – user82395214

+0

當然可以使用'var'而不是'let'。只要確保你讀了一下關於'let',因爲它太棒了! – GPX

相關問題