Javascript 以编程方式向承诺添加参数
我需要创建一个函数,它接收一个承诺作为第一个参数和一个参数数组(如果它至少有一个参数),如果没有,则接收null 我的函数如下所示: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
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:我没有否决投票。