如何将函数及其参数存储在数组中并按顺序执行?

时间:2017-10-19 22:39:37

标签: javascript arrays promise

我正在尝试将一系列函数存储在带有参数的数组中,然后按顺序执行它们。我一直在使用这个问题: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和承诺的绳索。我很感激耐心和帮助:)。

1 个答案:

答案 0 :(得分:0)

.then(someFunction(...))

您只需调用 someFunction()并将其结果传递给then()(就像任何其他参数一样)。

您需要传递一个使用您想要的参数调用它的函数:

.then(() => someFunction(...))