我正在尝试将一系列函数存储在带有参数的数组中,然后按顺序执行它们。我一直在使用这个问题: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()中返回promise,以便稍后链接到它。
这是我的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 :(得分:0)
.then(someFunction(...))
您只需调用 someFunction()
并将其结果传递给then()
(就像任何其他参数一样)。
您需要传递一个使用您想要的参数调用它的函数:
.then(() => someFunction(...))