我遇到了一个有趣的问题,我需要执行一堆请求,它们执行的顺序无关紧要。 我在这段代码上使用了以下库,Mocha,Supertest(用于激活RESTful请求)和Asynquence来帮助使用promise链。
所以我所做的就是创建一个函数数组,每个函数都包含一个POST请求。我的理由是映射此数组并执行' function.apply();'执行请求但由于某种原因无效,所以我转而使用Asynquence,它成功触发了请求,然而 Mocha失败并出现以下错误:" 错误:多次调用done()"。 这是我的代码:
我要做的第一件事就是使用地图来创建一个使用'数据'我将发送:
function queryGenerator(cookie, data, done, msg) {
return function() {
return request('www.myurl.com')
.post('/endpoint/sample')
.set('cookie', cookie)
.send(data)
.expect(200)
.end(function(err, res) {
if(err) { console.log('Error when posting to preferences setup on:', data); return done(err) };
done(msg);
})
}
}
然后我有一个函数来应用这些:
function executeFunction(fn) {
return fn.apply();
}
所以尝试这个不起作用:
collectionOfRequestsToExectute.map(executeFunction);
这些请求似乎并没有全部解雇。 但是,以下工作,在所有请求都执行的意义上,我得到以下错误:" 错误:多次调用done()"被摩卡抛出。
it("Turn all of the other emails off", function(done) {
const collectionOfRequestsToTurnOff = [nationalJobsPayloadTurnOff, hiringAlertsPayloadTurnOff, professionalsLikeYouPayloadTurnOff, newJobsPayloadTurnOff];
const functionsToExec = collectionOfRequestsToTurnOff.map(function(data) {
return queryGenerator(cookie, data, done);
});
ASQ('apply each request in array').all.apply(null, functionsToExec)
.val(function() {
var messages = Array.prototype.slice.call(arguments);
console.log('MESSAGES:', messages);
})
.or(function(err) {
console.log(err);
})
})
请帮忙! 我想避免必须逐一解雇这些请求。 提前谢谢!
修改:正如下面的回答,Roamer-1888(非常感谢)问题是我将Mocha的操作传递给queryGenerator,而后者又调用了()多次。
我有另一个问题,我尝试使用解决方案的示例映射要执行的函数集合,以将查询生成器上的承诺重命名为“dunn”' (见下面的代码)但是当我这样做时,我得到一个" 未捕获的TypeError:dunn不是函数"
functionsToExecute.map(function(fn) {
return fn.apply();
})
我觉得使用地图更具可读性,我不必使用ASQ('msg').all.apply(null,functionsToExec)...
答案 0 :(得分:0)
问题是,你有两个done()
,Mocha和ASQ。
如上所述,第二次尝试将Mocha的完成传递给queryGenerator()
,这是不正确的 - Mocha的done
确实会被多次调用。
在致电ASQ(...).all.apply(null, functionsToExec)
时,functionsToExec
中的每个功能都会自动传递给ASQ的(done, msg)
(它们被“显示”)。
要修复,您似乎只需要:
(cookie, data)
传递给queryGenerator
- 这些参数被困在关闭状态。(done, msg)
要清楚说明哪个done
拼写为ASQ已完成为dunn
(您可以根据自己的选择命名显示的参数)。
function queryGenerator(cookie, data) { // <<<<<< (cookie, data) here
return function(dunn, msg) { // <<<<<< (dunn, msg) here
return request('www.myurl.com')
.post('/endpoint/sample')
.set('cookie', cookie)
.send(data)
.expect(200)
.end(function(err, res) {
if(err) {
console.log('Error when posting to preferences setup on:', data);
dunn(err.message); // return not required
};
dunn(msg);
});
}
}
it("Turn all of the other emails off", function(done) {
const collectionOfRequestsToTurnOff = [nationalJobsPayloadTurnOff, hiringAlertsPayloadTurnOff, professionalsLikeYouPayloadTurnOff, newJobsPayloadTurnOff];
const functionsToExec = collectionOfRequestsToTurnOff.map(function(data) {
return queryGenerator(cookie, data);
});
ASQ('apply each request in array').all.apply(null, functionsToExec).val(function() {
var messages = Array.prototype.slice.call(arguments);
console.log('MESSAGES:', messages);
done(messages);
}).or(function(err) {
console.log(err);
done(err);
});
});