2017-10-19 60 views
0

我想将一系列函数与它们的参数存储在一个数组中,然后顺序执行它们。我一直在使用这个问题:How to chain execution of array of functions when every function returns deferred.promise? 并对此问题的具体答案:http://plnkr.co/edit/UP0rhD?p=preview如何将函数的参数存储在数组中并按顺序执行?

从我的理解,这可以用对象文字或数组来完成。我读过一些人们在数组中存储没有参数的函数的问题,但到目前为止还没有找到一个好的答案来将它们包含在参数中。

以下是我的尝试。我首先创建一个带参数的函数数组(现在用硬编码),然后将它们传递给ExecutePromiseChain()以供执行。从我看到的看起来,函数立即被调用,这是我不想要的。

Responses = []; 
function BuildInventoryList(){ 
    return new Promise(function(resolve, reject) { 
     f = [new CreateRequestWPromise(`https://${defaults.host}/inventory/88421`, {}), 
    new CreateRequestWPromise(`https://${defaults.host}/inventory/19357`,{})]; 

     resolve(ExecutePromiseChain(f)); 
}); 
} 

function ExecutePromiseChain(funcs){ 
    var promise = funcs[0]; 
    for (var i = 1; i < funcs.length; i++){ 
     promise = promise.then(funcs[i]); 
    } 
    return promise; 
} 

请注意,我在回国承诺ExecutePromiseChain(),所以我可以链,它以后。

这是我promisified http请求功能:

function CreateRequestWPromise(url, body){ 
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 

return new Promise(function(resolve, reject) { 
    var xhr = new XMLHttpRequest(); 
     xhr.onload = function(){ 
      if(xhr.status == 200){ 
       Responses.push(JSON.parse(xhr.response)); 
       resolve(xhr.responseText); 
      } 
      else{ 
       reject(xhr.statusText); 
      } 
     } 
     xhr.onerror = function() { 
      reject(Error("Network Error")); 
     }; 

    xhr.open("POST", url); 
    xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); 
    var bodyS = JSON.stringify(body); 
    xhr.send(bodyS); 
}); 
} 

我调用这些函数在与程序的启动:

BuildInventoryList().then(CreateRequestWPromise(`https://${defaults.host}/inventory/update`, 
    Items)); 

那么愚蠢的错误,我在这里做?为什么我的函数不能按顺序执行?

由于可能很明显,我还在学习Javascript和承诺的绳索。我很欣赏的耐心和帮助:)

+0

避免['Promise'构造反模式](https://stackoverflow.com/q/23803743/1048572?What -is最诺言建设,反模式和如何对避免-吧)! 'ExecutePromiseChain'已经返回一个promise,'BuildInventoryList'不应该使用'new Promise'。 – Bergi

+0

你的'f'似乎是一组promise,而不是返回promise的函数。 – Bergi

+0

'为什么我的函数不能顺序执行 - - 因为调用'CreateRequestWPromise'执行'XMLHttpRequest' –

回答

0
.then(someFunction(...)) 

你刚才称为someFunction(),并通过其结果then()(就像任何其他参数)。

您需要传递与调用的参数是一个函数,你想:

.then(() => someFunction(...)) 
相关问题