2017-03-08 17 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

相关问题