Javascript 以编程方式向承诺添加参数

Javascript 以编程方式向承诺添加参数,javascript,node.js,promise,Javascript,Node.js,Promise,我需要创建一个函数,它接收一个承诺作为第一个参数和一个参数数组(如果它至少有一个参数),如果没有,则接收null 我的函数如下所示: var executeMappingStep = (promiseStatus, myPromise, myPromiseParams) => { return new Promise((resolve, reject) => { //if the execution was success, there's no need t

我需要创建一个函数,它接收一个承诺作为第一个参数和一个参数数组(如果它至少有一个参数),如果没有,则接收null

我的函数如下所示:

var executeMappingStep = (promiseStatus, myPromise, myPromiseParams) => {
    return new Promise((resolve, reject) => {
        //if the execution was success, there's no need to invoke myPromise again
        if(promiseStatus.success == true)
           return resolve(promiseStatus.previousResponseSaved);

        if (myPromiseParams!= null) {
            //how I resolve this logic is my doubt
            myPromise.addArrayOfParameters(myPromiseParams);
        }

        myPromise().then(result => resolve(result)).catch(err => reject(err));
    });
};
var executeMappingStep = (promiseStatus, myPromise) => {
    return new Promise((resolve, reject) => {
        //if the execution was success, there's no need to invoke myPromise again
        if(promiseStatus.success == true)
           return resolve(promiseStatus.previousResponseSaved);    

        myPromise.then(result => resolve(result)).catch(err => reject(err));
    });
};
我在读关于.bind()函数的书,该函数适用于函数,但不适用于根据。我还看到了关于.apply()函数的一些内容,但这似乎不是我需要的

编辑 我的函数在没有参数时会像myFirstPromise一样被调用,在至少有一个参数时会像mySecondPromise一样被调用:

var executePromises = (myFirstPromise, mySecondPromisePromise) => {
    return new Promise((resolve, reject) => {
        //retrieve an array of every promise status
        var promisesStatus = getPromisesStatus();

        executeMappingStep(promisesStatus[0], myFirstPromise, null).then(result => {
                return convertToXml(result);
        }).then(result => {

            var parameters = {
                value1 : result,
                value2: [1,2,3],
                value3: "some string",
                value4: 10
            };  

            return executeMappingStep(promisesStatus[1], mySecondPromisePromise, parameters);
        }).then(result => resolve(result)).catch(err => reject(err));
    });
};

var myFirstPromise = function() {
    return new Promise(function (resolve, reject) { 
        //some logic for first promise
    });
}

var mySecondPromise = function(firstParam, secondParam, thirdParam, fourthParam) {
    return new Promise(function (resolve, reject) { 
        //some logic for second promise with its params
    });
}
可能,在函数addArrayOfParameters中,我需要循环到对象上的每个属性(我意识到数组不起作用),如

是否有一种方法可以在解析数组之前以编程方式从数组中添加参数

编辑2 这个逻辑背后的原因非常复杂,但这正是我需要解决的问题。基本上,在我的代码中,每个承诺都可能执行错误,executePromises函数中包含一个逻辑,它返回每个承诺的状态,无论是否成功执行。此逻辑涉及10个以上的承诺链接,如果其中一些承诺失败,例如:承诺编号5,则6,7等,则必须在某些管理后端中再次调用

我不知道如何为每个承诺复制逻辑,因此我想创建executeMappingStep函数来封装该逻辑。
可能很难解释,我尽量简化。我又做了一些改动来解释我刚才说的话

可能使用异步库可以解决您的问题。试着在你的控制台上运行代码,并对此进行研究

使用异步库:

var async = require("async");
async.waterfall([
    function (callback) {
        var methodParam = [1, 2, 3];
        console.log("first method called");
        callback(null, methodParam);
    },
    function (methodParams, callback) {
        var newParams = [4, 5, 6];
        newParams = methodParams.concat(newParams);
        console.log("second method called", methodParams);
        callback(null, newParams);
    }
], function (err, res) {
    if (err) {
        console.log("error occured");
    } else {
        console.log("final result", res);
    }
});
承诺:

var promise1 = (() => {
    return new Promise((resolve, reject) => {
        var methodParam = [1, 2, 3];
        console.log("first promise called");
        resolve(methodParam);
    });
});

var promise2 = ((methodParams) => {
    return new Promise((resolve, reject) => {
        var newParams = [4, 5, 6];
        newParams = methodParams.concat(newParams);
        console.log("second promise called", methodParams);
        resolve(newParams);
    });
});

promise1()
    .then((resPromise1) => {
        return promise2(resPromise1);
    }).then((resPromise2) => {
        console.log("final result", resPromise2);
    });

也许,我这里有很多复杂的事情,但无论如何,这是我想要的解决方案。 很高兴知道,.then函数可以在其他地方调用,承诺可以使用所需的参数创建,然后作为参数发送

话虽如此:

var executePromises = (myFirstPromise, mySecondPromisePromise) => {
    return new Promise((resolve, reject) => {
        //retrieve an array of every promise status
        var promisesStatus = getPromisesStatus();

        executeMappingStep(promisesStatus[0], myFirstPromise()).then(result => {
                return convertToXml(result);
        }).then(result => {

            var mySecondPromisePromiseParameter = mySecondPromise(result, [1,2,3], "some string", 10);   

            return executeMappingStep(promisesStatus[1], mySecondPromisePromiseParameter);
        }).then(result => resolve(result)).catch(err => reject(err));
    });
};
然后,executeMappingStep只接收承诺并调用。然后在内部,通过以下方式:

var executeMappingStep = (promiseStatus, myPromise, myPromiseParams) => {
    return new Promise((resolve, reject) => {
        //if the execution was success, there's no need to invoke myPromise again
        if(promiseStatus.success == true)
           return resolve(promiseStatus.previousResponseSaved);

        if (myPromiseParams!= null) {
            //how I resolve this logic is my doubt
            myPromise.addArrayOfParameters(myPromiseParams);
        }

        myPromise().then(result => resolve(result)).catch(err => reject(err));
    });
};
var executeMappingStep = (promiseStatus, myPromise) => {
    return new Promise((resolve, reject) => {
        //if the execution was success, there's no need to invoke myPromise again
        if(promiseStatus.success == true)
           return resolve(promiseStatus.previousResponseSaved);    

        myPromise.then(result => resolve(result)).catch(err => reject(err));
    });
};

promise使用了哪些参数以及它们是如何使用的?它们都是简单的值,例如int、字符串,或者在最坏的情况下是一个基元类型数组。
myPromise()。然后(
看起来像
myPromise
是一个构造允诺的函数,而不是允诺……是否有传递参数的地方,例如
myPromise(myPromiseParams)那么(…
?您的问题非常令人困惑,不清楚您的意思是什么以及它们是如何使用的。myPromiseParams中的参数应该如何更改解析值“result”?请给出一些示例。这似乎并不能解决我遇到的问题。在每个承诺中,我都需要按照请求使用以前调用的响应。这意味着在第一个承诺的“then”函数中,我需要调用第二个。PD:我没有否决投票。